Почему разница в использовании
find . -exec ls '{}' \+
и
find . -exec ls '{}' \;
Я получил:
$ find . -exec ls \{\} \+
./file1 ./file2
.:
file1 file2 testdir1
./testdir1:
testdir2
./testdir1/testdir2:
$ find . -exec ls \{\} \;
file1 file2 testdir1
testdir2
./file2
./file1
+
ассоциированным-exec
всегда экранируется, но с+
ассоциированным-mtime
- нет. Вы знаете причину? Я думаю, это привычка избегать;
связанных с-exec
.;
. Не могу себе представить, что когда-либо нужно бежать+
Все ответы пока верны. Я предлагаю это как более ясную (для меня) демонстрацию поведения, которое описано с использованием,
echo
а неls
:С точкой с запятой, команда
echo
вызывается один раз для каждого найденного файла (или другого объекта файловой системы):С плюсом, команда
echo
вызывается только один раз. Каждый найденный файл передается в качестве аргумента.Если
find
появляется большое количество результатов, вы можете обнаружить, что вызываемая команда ограничивает количество аргументов.источник
xargs
делают ... в принципе это никогда не захлебывается слишком много аргументов.find
(иxargs
) в Solaris испускает больше аргументов, чем можно было бы использовать.xargs
(Аfind
) в findutils` ГНУ , кажется, ведут себя более разумно, но не каждый использует GNU.find
будут пытаться избежать ограничения количества аргументов. И это включает в себя Солярис (по крайней мере 10). Где это может потерпеть неудачу, так это если вы делаете что-то вродеfind ... -exec ksh -c 'cmd "$@" "$@"' sh {} +
илиfind ... -exec ksh -c 'files="$*" cmd "$@"' sh {} +
, но наfind
самом деле не можете быть обвинены в этом. Обратите внимание, что GNUfind
была одной из последнихfind
поддерживаемых реализаций+
(раньше было неудобно переносить скрипт на системы GNU).От
man find
:-exec команда;
-exec команда {} +
Итак, насколько я понимаю,
\;
выполняет отдельную команду для каждого найденного файлаfind
, в то\+
время как добавляет файлы и выполняет одну команду для всех из них. Это\
побег, так что это:против
Выполнение вышеизложенного в моей оболочке отражало вывод вашего вопроса.
пример того, когда вы хотели бы использовать
\+
Предположим, два файла,
1.tmp
и2.tmp
:1.tmp:
2.tmp:
С участием
\;
:Принимая во внимание, что если вы используете
\+
(для объединения результатовfind
):Так что в этом случае это разница между
diff 1.tmp; diff 2.tmp
иdiff 1.tmp 2.tmp
Есть случаи, когда
\;
это уместно и\+
будет необходимо. Использование\+
withrm
является одним из таких примеров, когда при удалении большого количества файлов производительность (скорость) будет выше\;
.источник
find
имеет специальный синтаксис. Вы используете их{}
как они есть, потому что они имеют смысл найти в качестве пути к найденному файлу, и (большинство) оболочки не интерпретируют их иначе. Вам нужна обратная косая черта,\;
потому что точка с запятой имеет значение для оболочки, которая съедает ее прежде, чемfind
сможет ее получить. Итак, чтоfind
хочет видеть ПОСЛЕ того, как оболочка готова, в списке аргументов, передаваемом программе C, естьно тебе нужно
\;
в командной строке получить точку с запятой через оболочку для аргументов.Вы можете сойти с рук,
\{\}
потому что интерпретируемая оболочкой интерпретация\{\}
просто{}
. Точно так же вы можете использовать '{}'.То, что вы не можете сделать, это использовать
потому что оболочка интерпретирует это как один аргумент,
а
rm {} ;
не название команды. (По крайней мере, если кто-то действительно не крутится.)Обновить
разница между
и
Это
+
объединяет имена в командной строке.источник
Разница между
;
(точка с запятой) или+
(знак плюс) заключается в том, как аргументы передаются в параметр find-exec
/-execdir
. Например:Использование
;
будет выполнять несколько команд (отдельно для каждого аргумента),Пример:
using
+
выполнит наименьшее количество возможных команд (так как аргументы объединены). Это очень похоже на то, какxargs
работает команда, поэтому она будет использовать как можно больше аргументов для каждой команды, чтобы избежать превышения максимального лимита аргументов в строке.Пример:
Смотрите также:
man find
источник
мы пытались найти файл для домашнего хозяйства.
найти . -exec echo {} \; Команда побежала за ночь, в итоге безрезультатно.
найти . -exec echo {} \ + имеют результаты и заняли всего несколько часов.
Надеюсь это поможет.
источник