Intereting Posts
Как автоматически запускать команду после выхода из ssh chroot всей файловой системы, за исключением одного файла Перейти к следующему помеченному сообщению в Mutt Почему мы не должны редактировать grub.cfg для grub2 Bash запоминает неправильный путь к исполняемому файлу, который был перемещен / удален Как установить aMSN в Scientific Linux? Возвратная линия на следующей строке Огромная страница и производительность improvemnt В bash, каковы потенциальные негативные последствия приостановки процесса с контролем-z? Добавить открытый ключ на удаленные серверные авторизованные ключи без сохранения файла там Конфигурация netfilter позволяет openvpn В irssi, как мне отображать предыдущие чаты текущего chan или текущего пользователя, если в bitblee? Является ли имя пользователя в регистре Unix чувствительным? rsync и xfr # 1, to-chk = 0/1, что они означают? Используя sshpass, код возврата (статус выхода) отличается по неизвестным причинам с использованием допустимых команд

Почему 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.

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

Благодаря «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.