Страница руководства (или онлайн-руководство по 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 строит свои командные строки. В команде разрешен только один экземпляр `{} '. Команда выполняется в стартовом каталоге.