Ответы:
Вы можете передать вывод find
через head
:
find . -name '*.txt' | head -n 3
head
запускается и ожидает ввода с левой стороны трубы. Затем find
запускается и ищет файлы, соответствующие указанным критериям, отправляя свои выходные данные по каналу. Когда head
получено и напечатано количество запрошенных строк, оно завершается, закрывая канал. find
замечает закрытую трубу, и она также заканчивается. Просто, элегантно и эффективно.
-n 3
можно сказать, что он совместим с POSIX и поэтому может быть более переносимым.
Этот другой ответ несколько ошибочен. Команда
find . -name '*.txt' | head -n 3
Тогда есть объяснение в одном из комментариев [выделено мной]:
head
запускается и ожидает ввода с левой стороны трубы. Затемfind
запускается и ищет файлы, соответствующие указанным критериям, отправляя свои выходные данные по каналу. Когдаhead
получено и напечатано количество запрошенных строк, оно завершается, закрывая канал.find
замечает закрытую трубу, и она также заканчивается. Просто, элегантно и эффективно .
Это почти правда.
Проблема в том, find
что закрытая труба замечается только тогда, когда она пытается записать в нее - в этом случае, когда найдено 4-е совпадение. Но если 4-го матча нет, то find
продолжим. Ваша оболочка будет ждать! Если это происходит в сценарии, сценарий будет ждать, несмотря на то, что мы уже знаем, что вывод канала является окончательным, и к нему ничего нельзя добавить. Не так эффективно.
Эффект незначителен, если этот конкретный find
процесс завершается быстро сам по себе, но при сложном поиске в большом дереве файлов команда может излишне отложить все, что вы хотите сделать дальше.
Не очень идеальное решение - запустить
( find … & ) | head -n 3
Таким образом, при head
выходе оболочка продолжается немедленно. Фоновый find
процесс может тогда быть проигнорирован (он рано или поздно завершится) или будет нацелен на pkill
что-либо.
Чтобы доказать концепцию, вы можете искать /
. Мы ожидаем только один матч, но ищем find
его везде, и это может занять много времени.
find / -wholename / 2>/dev/null | head -n 1
Завершите его с помощью Ctrl+, Cкак только увидите проблему. Теперь сравните:
pidof find ; ( find / -wholename / 2>/dev/null & ) | head -n 1 ; pidof find
find . -name '*.txt' -print -quit
только показать первый матч и разрешитьfind
выход после первого матча. Я не знаю, можно ли приспособиться к случаю «выход после нахождения n совпадений».