Страница руководства (или онлайн-руководство GNU ) в значительной степени объясняет все.
команда find -exec {} \;
Для каждого результата выполняется command {}
. Все вхождения {}
заменяются именем файла. ;
начинается с косой черты, чтобы оболочка не могла его интерпретировать.
команда find -exec {} +
Каждый результат добавляется к command
и выполняется впоследствии. Принимая во внимание ограничения на длину команды, я думаю, что эту команду можно выполнить несколько раз, при этом страница справки поддерживает меня:
общее количество вызовов команды будет намного меньше количества совпавших файлов.
Обратите внимание на эту цитату со страницы руководства:
Командная строка создается так же, как xargs создает свои командные строки
Именно поэтому между {}
и +
запрещены символы, кроме пробелов. +
заставляет find обнаружить, что аргументы должны быть добавлены к команде, как xargs
.
Решение
К счастью, реализация GNU mv
может принимать целевой каталог в качестве аргумента, либо с -t
, либо с более длинным параметром --target
. Его использование будет:
mv -t target file1 file2 ...
Ваша find
команда становится:
find . -type f -iname '*.cpp' -exec mv -t ./test/ {} \+
со страницы руководства:
-exec команда;
Выполнить команду; true, если возвращается 0 статус. Все последующие аргументы для поиска принимаются в качестве аргументов команды до аргумента, состоящего из `; ' встречается. Строка `{} 'заменяется текущим именем файла, которое обрабатывается везде, где оно встречается в аргументах команды, а не только в аргументах, где он один, как в некоторых версиях find. Обе эти конструкции, возможно, должны быть экранированы (с `\ ') или заключены в кавычки, чтобы защитить их от расширения оболочкой. В разделе ПРИМЕРЫ приведены примеры использования опции -exec. Указанная команда запускается один раз для каждого соответствующего файла. Команда выполняется в начальном каталоге. Существуют неизбежные проблемы безопасности, связанные с использованием действия -exec; вместо этого вы должны использовать опцию -execdir.
-exec команда {} +
Этот вариант действия -exec запускает указанную команду для выбранных файлов, но командная строка создается путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество совпавших файлов. Командная строка строится почти так же, как xargs создает свои командные строки. Только один экземпляр `{} 'разрешен в команде. Команда выполняется в начальном каталоге.