Відповіді:
Ви можете передавати вихід 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 збігів".