У меня есть следующая команда:
find . -type d -mtime 0 -exec mv {} /path/to/target-dir \;
Это переместит каталог, основанный на другой каталог. Как я могу использовать xargs
вместо exec
, чтобы сделать то же самое.
У меня есть следующая команда:
find . -type d -mtime 0 -exec mv {} /path/to/target-dir \;
Это переместит каталог, основанный на другой каталог. Как я могу использовать xargs
вместо exec
, чтобы сделать то же самое.
Если у вас есть GNU mv
(и find
и xargs
), вы можете использовать опцию -t
для 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
в .
в 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', но whitespace, -r
означает no-run-if-empty, поэтому вы не получите никаких ошибок, если find
не получил никакого вывода. (-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 {} +
в противном случае, это более простое решение, которое не требует xargs:
find . -depth -type d -mtime 0 -exec mv -t /path/to/target-dir {} +
Обратите внимание, что я добавил -depth, иначе у вас будут ошибки, когда обрабатываются как каталог, так и один из его подкаталогов.