Используйте xargs для mv каталога из результатов поиска в другой каталог
у меня есть следующие команды:
find . -type d -mtime 0 -exec mv {} /path/to/target-dir ;
это переместит каталог, основанный в другой каталог. Как я могу использовать xargs
вместо exec
сделать то же самое.
5 ответов
если у вас есть GNU mv
(и find
и xargs
), вы можете использовать до mv
(и -print0
на find
и -0
на xargs
):
find . -type d -mtime -0 -print0 | xargs -0 mv -t /path/to/target-dir
обратите внимание, что современные версии find
(совместим с POSIX 2008) поддержка +
на месте ;
и ведут себя примерно так же, как xargs
без использования xargs
:
find . -type d -mtime -0 -exec mv -t /path/to/target-dir {} +
это делает find
группируйте удобные номера имен файлов (каталогов) в один вызов программы. У вас нет уровня контроля над количеством аргументов, переданных в mv
это xargs
обеспечивает, но вам редко это нужно в любом случае. Это все еще зависит от -t
опция для GNU mv
.
С BSD xargs (для OS X и FreeBSD), вы можете использовать -J
, который был построен для этого:
find . -name some_pattern -print0 | xargs -0 -J % mv % target_location
это переместит все, что соответствует some_pattern
на .
to target_location
С GNU xargs (для Linux и Cygwin), используйте -I
вместо:
find . -name some_pattern -print0 | xargs -0 -I % mv % target_location
устаревший -i
опция GNU xargs подразумевает -I{}
и может использоваться следующим образом:
find . -name some_pattern -print0 | xargs -0 -i mv {} target_location
Примечание. что BSD xargs также имеет -I
вариант, но это делает что-то еще.
find ./ -maxdepth 1 -name "some-dir" -type d -print0 | xargs -0r mv -t x/
найти:
с опцией -print0
, вывод закончится на '\0';
xargs:
с опцией -0
, он разделит args на "\0", но пробелы,-r
означает no-run-if-empty, поэтому вы не получите никаких ошибок, если find
не получил никакого выхода. (The -r
является расширением GNU.)
Я обычно использую это в сценариях, когда я не уверен, существуют ли целевые файлы или нет.
find
не очень хороший инструмент для этого. Я предполагаю, что вы хотите переместить все подкаталоги в другой каталог. find
выведет такие вещи, как
./a
./a/b
./a/b/c
./a/b/c/d
после ./a
будет перемещена во-первых, вы просто получите сообщения о том, что нет такого файла или каталога' все подкаталоги.
вы должны просто использовать mv */ /another/place
-- конечная косая черта подстановочного знака ограничивает расширение только dirs.
Если вы не используете GNU mv, вы можете использовать эту команду:
find . -depth -type d -mtime 0 -exec bash -c 'declare -a array;j=1;for i; do array[$j]="$i"; j=$((j+1));done; mv "${array[*]}" /path/to/target-dir' arg0 {} +
в противном случае, вот более простое решение, которое не требует размер:
find . -depth -type d -mtime 0 -exec mv -t /path/to/target-dir {} +
обратите внимание, что я добавил-depth, иначе у вас будут ошибки при обработке каталога и одного из его подкаталогов.