Как скопировать файлы из папки с помощью команды 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
команда.