Почему find не принимает '-exec cp {} dir +'?

У меня есть каталог dir1 который содержит много файлов, имена которых заканчиваются на .jpg или .png . Я хочу скопировать все .png файлы в dir2 который пуст.

Эта команда работает:

 find dir1 -name '*.png' -exec cp {} dir2 \; 

но эта команда не выполняет:

 find dir1 -name '*.png' -exec cp {} dir2 + find: missing argument to `-exec' 

Я также пробовал:

 find dir1 -name '*.png' -exec cp {} -t dir2 + find: missing argument to `-exec' 

а также:

 find dir1 -name '*.png' -exec cp {} dir2 \+ find: missing argument to `-exec' 

Посмотрев на эту страницу , я даже попробовал:

 find dir1 -name '*.png' -exec cp {} dir2 {} + find: Only one instance of {} is supported with -exec ... + 

На этой странице написано:

-exec {} + был добавлен в [версии] 4.2.12 в 2005 году

Моя версия find – 4.4.2.

Что я делаю не так?

2 Solutions collect form web for “Почему find не принимает '-exec cp {} dir +'?”

Благодаря «steeldriver», я решил, что ответ заключается в том, что спецификация POSIX запрещает что-либо существовать между {} и + after -exec .

Конечно, для решения проблемы подходит POSIX-совместимое решение:

find dir1 -name '*.png' -exec sh -c 'cp "$@" dir2' null {} +

Нет необходимости использовать нестандартные функции конкретного поставщика.

BTW: AFAIK, функция execplus была представлена ​​в 1989 году Дэвидом Корном, работая в SVr4. Важная справочная информация: POSIX не определяет новые функции, а просто стандартизирует существующие решения, поэтому, если стандарт POSIX находится в противоречии с решением, которое было мастером, POSIX обычно ошибается.

Известный недавний пример: waitid () также был введен SVr4 в 1989 году и определяет, что все 32 бита из кода выхода должны быть доступны родительскому. Стандарт SUSv2 (с 1997 года) был правильным, но по неизвестным причинам более поздние версии упомянули, что код выхода должен быть замаскирован 0xFF. Это было недавно определено как ошибка POSIX.

  • Копировать файл во все подкаталоги, содержащие файл с определенным именем
  • Если имя файла имеет более n символов, удалите последние
  • Используя `find`, как я могу получить` rm` для печати более полного имени пути, чем при выполнении через `-execdir`?
  • как выбрать файлы в каталоге с булевым оператором AND
  • Как правильно удалить странные символы в сценарии bash?
  • Получение размера родительских папок при использовании поиска для поиска критериев?
  • find и regex - найти файлы с именами, начинающимися с данного имени
  • Как заменить строку во всех файлах в каталоге и во всех подкаталогах без изменения каких-либо скрытых каталогов / файлов?
  • Найти неверные результаты команды с фильтром дней
  • Как интерактивно удалить все каталоги, соответствующие заданным критериям?
  • Как правильно использовать find с регулярным выражением?
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.