С GNU mv :
find path_A -name '*AAA*' -exec mv -t path_B {} +
Это будет использовать -exec
опцию поиска, которая заменяет {}
каждый результат поиска по очереди и запускает команду, которую вы ему даете. Как объяснено в 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.
В этом случае мы используем +
версию -exec
так, чтобы мы выполняли как можно меньше mv
операций:
-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.
+
работу, вы можете прочитать мою цитату выше илиman find
вместо этого-exec mv {} path_b +
и он терпел неудачу с ошибками разрешений. TBH, я до сих пор не понимаю, почему, но-exec mv -t path_b {} +
работает удовольствие!-exec ... {} +
, то{}
должен быть последним, прежде чем+
. Именно поэтому он используетmv -t destdir {} +
и нетmv {} destdir +
.-exec mv {} destdir ';'
Вместо этого использовали одну простую , но она выполнялась быmv
один раз для каждого файла.Вы можете сделать что-то вроде ниже.
Где,
-0
Если есть пробелы или символы (включая символы новой строки), многие команды не будут работать. Эта опция заботится об именах файлов с пустым пространством.-I
Заменить вхождения replace-str в исходных аргументах именами, считанными из стандартного ввода. Кроме того, пробелы без кавычек не заканчивают элементы ввода; вместо этого разделителем является символ перевода строки.тестирование
Я создал две директории как
sourcedir
иdestdir
. Теперь, я создал кучу файлов внутри ,sourcedir
какfile1.bak
,file2.bak
иfile3 with spaces.bak
Теперь я выполнил команду как,
Теперь, внутри
destdir
, когда я делаюls
, я мог видеть , что файлы перемещены изsourcedir
вdestdir
.Рекомендации
http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/
источник
В интересах пользователей OS X, сталкивающихся с этим вопросом, синтаксис в OS X немного отличается. Предполагая, что вы не хотите выполнять рекурсивный поиск в подкаталогах
path_A
:Если вы хотите искать все файлы рекурсивно в
path_A
:источник
find
который я использовал. Хорошие моменты:-maxdepth
(особенно если path_B является подкаталогом - избегаетmv
попыток переместить файлы уже там!) И использование \; (поэтому {} не должен быть последним параметром, иmv
можно использовать нормальный синтаксис)Это
-exec
лучший способ сделать это. Если по какой-либо причине это не вариант, вы также можете прочитать результаты в цикле:Это безопасный способ, он может работать с именами файлов, которые содержат пробелы, символы новой строки или другие странные символы. Более простой способ, который не работает, если имена файлов не состоят только из простых буквенно-цифровых символов ,
Но используйте цикл while.
источник
your file names consist only of simple alphanumeric characters
, например, при достиженииARG_MAX
Использование только функций POSIX
find
(и такжеmv
):Дальнейшее чтение:
источник
По-другому
источник