Если вы напишите
find -name '*modified.tif' | xargs cp directory
тогда это то же самое, что писать
cp directory filename file1modified.tif file2modified.tif
(или какие-либо имена файлов совпадают), что неверно, потому что xargs
по умолчанию добавляет аргументы.
find -name '*modified.tif' -exec cp {} directory \;
совпадает с
cp file1modified.tif directory
cp file2modified.tif directory
что вы хотите.
Вы можете достичь того же с xargs
, используя
xargs -I{} cp {} directory
, чтобы указать, где в команде вы хотите использовать аргумент, но это означает, что за один раз будет скопирован только один файл (поскольку -I
подразумевает -L1
).
Чтобы не вызывать cp
один раз для файла, вы можете использовать опцию -t
для cp
, чтобы копируемые файлы можно было добавить в конец команды (требуется GNU cp
):
find -name '*modified.tif' | xargs cp -t directory
, что эквивалентно
cp -t directory file1modified.tif file2modified.tif
или лучше, заботясь о пробелах в именах файлов,
find -name '*modified.tif' -print0 | xargs -0 cp -t directory
В качестве альтернативы, без xargs
:
find -name '*modified.tif' -exec cp -t directory {} +
, где -exec {} +
обязательно вызывает cp
как можно меньше раз.