Страница руководства (или онлайн-руководство по GNU ) почти все объясняет.
find -exec command {} \;
Для каждого результата 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 команда;
Выполнить команду; истина, если возвращается 0 статус. Все следующие аргументы для поиска считаются аргументами команды до тех пор, пока не будет аргумент, состоящий из `; ' встречается. Строка `{} 'заменяется текущим именем файла, обрабатываемым везде, где она встречается в аргументах команды, а не только в аргументах, где она одна, как в некоторых версиях find. Обе эти конструкции, возможно, потребуется экранировать (с помощью `\ ') или заключить в кавычки, чтобы защитить их от расширения оболочкой. В разделе ПРИМЕРЫ приведены примеры использования параметра -exec. Указанная команда запускается один раз для каждого совпадающего файла. Команда выполняется в стартовом каталоге. При использовании действия -exec возникают неизбежные проблемы безопасности; вместо этого вам следует использовать параметр -execdir.
-exec команда {} +
Этот вариант действия -exec запускает указанную команду для выбранных файлов, но командная строка строится путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество совпадающих файлов. Командная строка строится почти так же, как xargs строит свои командные строки. В команде разрешен только один экземпляр `{} '. Команда выполняется в стартовом каталоге.