Знайти лише перші декілька збігаються файлів за допомогою find?


17

Скажіть, що *.txtв каталозі може бути сотні файлів. Я хочу лише знайти перші три *.txtфайли, а потім вийти з процесу пошуку.

Як цього досягти за допомогою findутиліти? Я прослухав його сторінку на сторінці, здавалося, не такий варіант для цього.


3
Ви можете використовувати find . -name '*.txt' -print -quitлише показ першого матчу та findвипуск після першого матчу. Я не знаю, чи можна адаптуватися до справи "вихід після пошуку n збігів".
NN

Відповіді:


22

Ви можете передавати вихід findчерез head:

find . -name '*.txt' | head -n 3

2
Я знав це, я хочу вийти з процесу пошуку після з'ясування перших трьох відповідних файлів. Тут може бути величезна кількість відповідних файлів, які мене не цікавлять.
mitnk

2
Я думаю, що команда find закінчується після того, як голова надрукувала перші 3 файли
Chris Card

1
Так, це дивно, але ти маєш рацію.
mitnk

19
Це зовсім не дивно - це як труби працюють в UNIX. headзапускається і чекає введення з лівої частини труби. Потім findзапускається і шукає файли, які відповідають заданим критеріям, надсилаючи його вихід через трубу. Коли headотримано та роздрукується кількість запитуваних рядків, вона припиняється, закриваючи трубу. findпомічає закриту трубу, і вона також припиняється. Простий, елегантний та ефективний.
D_Bye

3
Підводячи підсумок, -n 3є POSIX сумісної , і тому , ймовірно, буде більш стерпним.
l0b0

4

Ця інша відповідь дещо хибна. Команда є

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.