рекурсивное перемещение файлов в linux


find ./dir -type f -iname "*.t[argz]*[bz2]" -print | xargs mv --target-directory=dir кажется, сбой в файле, который имеет пробелы в имени. как его улучшить? или альтернатива?

Спасибо за ответ ниже: мой mv не поддерживает --null или -0, Я использую cygwin:

$ mv --help
Usage: mv [OPTION]... [-T] SOURCE DEST
  or:  mv [OPTION]... SOURCE... DIRECTORY
  or:  mv [OPTION]... -t DIRECTORY SOURCE...
Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.

Mandatory arguments t
.

3 4

3 ответа:

Используйте -print0 вместо -print в команде find, а параметр xargs -0 (или --null) - тогда в качестве разделителей будут использоваться нули, а не новые строки и пробелы.

find ./dir -type f -iname "*.t[argz]*[bz2]" -print0 | xargs --null mv --target-directory=dir

Вы смотрели на опцию-exec для поиска?

find ./dir -type f -iname "*.t[argz][bz2]" -exec mv {} --target-directory=dir ';' 

Параметр-exec будет выполнять все параметры, следующие за ним как команда, пока не увидит точку с запятой, заключенную в кавычки. Таким образом, вам не придется иметь дело с проблемой интервалов.

GNU find

find ./dir -type f -iname "*.t[argz]*[bz2]" -exec mv "{}" /destination +;