Как скопировать файлы из папки с помощью команды find с действием -exec или с помощью xargs в другую папку

Я хотел бы использовать команду find с действием -exec со знаком плюс (+) (для эффективности) или с xargs для копирования файлов из одного каталога в другой. Следующий ответ не работает для меня. Я нахожусь под версией bash: 4.3.48(1). Попытка:

find . \( \( -type f -size -2M \) -o \( -type f -size 2M \) \) -exec cp '{}' ~/Pictures/test_folder '+'

или же:

find . \( -type f -size -2M \) -o \( -type f -size 2M \) | xargs cp -t ~/Pictures/test_folder 

не работает для меня. Может быть, я допустил какую-то синтаксическую ошибку, но я уже попробовал несколько вариантов вышеупомянутых команд, и я до сих пор не могу заставить ее работать. Папка test - это место, куда я хочу скопировать файлы.

1 ответ

Решение

Я ожидаю, что это сработает:

find . -type f \( -size -2M -o -size 2M \) -exec cp -t ~/Pictures/test_folder {} +

(Я вынул общий -type f тестовое задание.)

С +, {} как ожидается, будет последним элементом в -exec команда. Из GNU найти руководство:

Только один {} разрешено в команде, и оно должно появиться в конце, непосредственно перед +, + появляться в любой позиции, кроме сразу после {} не считается особенным (то есть не завершает команду).

Если вы используете find а также xargsне забудьте использовать -print0 а также -0 опции:

find ... -print0 | xargs -0 cp -t ...

С -print0имена файлов ограничиваются символом ASCII NUL, единственный из которых не допускается в путях. Без этого xargs можно разделить имена файлов на пробелы, поэтому ./file1 - foo.txt будет рассматриваться как ./file1, - а также foo.txt посредством cp команда.

Другие вопросы по тегам