Z GNU mv :
find path_A -name '*AAA*' -exec mv -t path_B {} +
To użyje -exec
opcji find, która po kolei zamienia {}
z każdym wynikiem find i uruchamia podane polecenie. Jak wyjaśniono w man find
:
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered.
W takim przypadku korzystamy z +
wersji, -exec
aby mv
wykonać jak najmniej operacji:
-exec command {} +
This variant of the -exec action runs the specified command on
the selected files, but the command line is built by appending
each selected file name at the end; the total number of invoca‐
tions of the command will be much less than the number of
matched files. The command line is built in much the same way
that xargs builds its command lines. Only one instance of `{}'
is allowed within the command. The command is executed in the
starting directory.
+
praca, możesz przeczytać mój cytat powyżej lubman find
zamiast-exec mv {} path_b +
i nie udało się z błędami uprawnień. TBH, wciąż nie rozumiem dlaczego, ale-exec mv -t path_b {} +
działa uczta!-exec ... {} +
The{}
musi być ostatnią rzeczą przed+
. Dlatego używa,mv -t destdir {} +
a nie używamv {} destdir +
.-exec mv {} destdir ';'
Zamiast tego zastosowano jedno zimno , ale wykonałoby się tomv
raz dla każdego pliku.Możesz również zrobić coś takiego jak poniżej.
Gdzie,
-0
Jeśli są puste miejsca lub znaki (w tym znaki nowej linii), wiele poleceń nie będzie działać. Ta opcja obsługuje nazwy plików z pustą przestrzenią.-I
Zamień wystąpienie replace-str w argumentach początkowych na nazwy odczytane ze standardowego wejścia. Ponadto, niecytowane puste miejsca nie kończą elementów wejściowych; zamiast tego separatorem jest znak nowej linii.Testowanie
Utworzyłem dwa katalogi jako
sourcedir
idestdir
. Teraz, stworzyłem kilka plików wewnątrzsourcedir
jakfile1.bak
,file2.bak
ifile3 with spaces.bak
Teraz wykonałem polecenie jako
Teraz, w środku
destdir
, kiedy niels
mogłem zobaczyć, że pliki zostały przeniesione odsourcedir
dodestdir
.Bibliografia
http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/
źródło
Z korzyścią dla użytkowników OS X napotykających to pytanie, składnia w OS X jest nieco inna. Zakładając, że nie chcesz wyszukiwać rekurencyjnie w podkatalogach
path_A
:Jeśli chcesz przeszukać rekursywnie wszystkie pliki w
path_A
:źródło
find
której użyłem.-maxdepth
Zalety : (szczególnie jeśli ścieżka_B jest podkatalogiem - unikamv
prób przenoszenia plików już tam znajdujących się!) I używania \; (więc {} nie musi być ostatnim parametrem imv
można użyć normalnej składni)To
-exec
najlepszy sposób, aby to zrobić. Jeśli z jakiegokolwiek powodu nie jest to opcja, możesz również odczytać wyniki w pętli:Jest to bezpieczny sposób, może poradzić sobie z nazwami plików, które zawierają spacje, znaki nowej linii lub inne dziwne znaki. Prostszy sposób, ale taki, który zawiedzie, chyba że nazwy plików składają się tylko z prostych znaków alfanumerycznych , to
Ale użyj pętli while.
źródło
your file names consist only of simple alphanumeric characters
np.ARG_MAX
Używanie tylko funkcji POSIX
find
(i równieżmv
):Dalsza lektura:
źródło
Inny sposób
źródło