Найти файлы и переместить их в другую папку с -exec

С помощью GNU Parallel это выглядит так:

find ${FOLDER} -iname "*${SOME_STRING}*" |
  parallel cp {} '{= s/ABC/XYZ/g =}'

Конструкция {= =} содержит выражение Perl, которое изменяет $_.

Одно из преимуществ заключается в том, что GNU Parallel делает то, что нужно, даже если у вас есть файлы с именами:

My brother's 12" records worth >100$.txt

или ужасы вроде:

touch Y-"$(perl -e 'print pack("c*",1..9,11..46,48..255)')"
-1
11.11.2018, 15:38
2 ответа

{}должен быть концом команды -exec. Команда mvподдерживает это с опцией -t:

.
mv [OPTION]... -t DIRECTORY SOURCE...

Таким образом, ваша команда будет:

find ~ -iregex ".*cheat.*\.pdf" -exec mv -t cheatSheet "{}" +
1
28.01.2020, 05:08

При использовании -exec... {} +{}должен быть в конце, непосредственно перед +.

Это означает, что вам придется использовать

-exec mv -t cheatSheet {} +

для чего потребуется доступ к GNU mv. Без GNU mvвы бы использовали

-exec mv {} cheatSheat \;

для перемещения по одному файлу или

-exec sh -c 'mv "$@" cheatSheet' sh {} +

для вызова внутристрочного скрипта -, который перемещает все файлы за один раз.

Вам также не нужно -iregex. Следующее будет легче читать и понимать:

find "$HOME" -ipath '*cheat*.pdf' \
    -exec sh -c 'mv "$@" cheatSheet' sh {} +

или, для ясности, одно из следующего, которое делает то, что вы на самом деле имеете в виду (это зависит от того, хотите ли вы, чтобы cheatбыло частью имени файла в конце пути (первый вариант )или одно из имен каталогов в пути (второй вариант)):

find "$HOME" -iname '*cheat*.pdf' \
    -exec sh -c 'mv "$@" cheatSheet' sh {} +

find "$HOME" -ipath '*cheat*/*' -iname '*.pdf' \
    -exec sh -c 'mv "$@" cheatSheet' sh {} +

Обратите внимание, что -ipathявляется расширением GNU find, но -iname, хотя и не соответствует стандарту -, реализуется чаще.

Также стоит отметить, что если у вас есть конфликты имен, то есть файлы с одинаковыми именами, вы перезапишете некоторые уже перемещенные файлы в процессе перемещения других файлов. С помощью GNU mvвы можете избежать этого, используя либо параметр -n(не затирать существующие файлы ), либо параметр -b(переименовывать/создавать резервные копии существующих файлов ).

Связанные:

1
28.01.2020, 05:08

Теги

Похожие вопросы