Я использую этот сценарий от git/contrib с ударом. Это дает мне ответвление мерзавца и автозавершение также. состояние мерзавца может быть взломано в довольно легко также, от того, что я понимаю.
Просто используйте -m
опция GNU grep
который прекращает читать файл после (в примере) одно соответствие.
find dir -iname '*.ext' -exec grep -m 1 'pattern' {} \;
Вы могли сделать это с awk сценарием:
find dir -iname '*.ext' -exec awk '/pattern/{print;exit}' {} \;
-quit
? Это говорит find
выходить после первого соответствия.
– Kevin
01.08.2013, 00:54
Если ищущая команда не имеет никакого способа остановиться после первого соответствия, можно отфильтровать его результаты и сохранить только первую выходную строку: command 'pattern' /path/to/file | head -n 1
. Команда получит сигнал SIGPIPE когда head
выходы, таким образом, это могло бы продолжить искать еще несколько соответствий из-за буферизации, но это остановится до конца файла, если будет много соответствий.
Так как необходимо выполнить команду оболочки (для установки канала), необходимо вызвать sh
от find
. Следите за заключением в кавычки: Вам нужен один слой кавычек для внешней оболочки и другого для оболочки, запущенной find
. Можно поместить одинарные кавычки вокруг команды внутренней оболочки и работы в одинарных кавычках с '\''
взлом (заканчивают литерал одинарной кавычки, \'
для литеральной одинарной кавычки, и запускают новый литерал одинарной кавычки на одном дыхании), этот способ, которым Вам не нужно никакое другое заключение в кавычки в шаблоне (если шаблон не содержит a '
то, что Вы представили как '\''
, в этом случае необходимо будет сделать это '\'\\\'\''
).
find dir -iname '*.ext' -exec sh -c 'command '\''pattern'\'' "$0" | head -n 1' {} \;
Вместо того, чтобы волноваться о заключении в кавычки шаблона, можно поместить его снаружи и передать его в качестве параметра.
find dir -iname '*.ext' -exec sh -c 'command "$0" "$1" | head -n 1' 'pattern' {} \;
Это будет немного быстрее для вызова только одной оболочки и цикла по файлам.
find dir -iname '*.ext' -exec sh -c '
for f; do command "$0" "$f" | head -n 1; done
' 'pattern' {} +