Только найдите, что первое несколько подобранных использований файлов находят?

Intel Core 2 (i5) является 64-разрядной поддержкой процессора Intel 64, Intel 64 является реализацией Intel x86-64

17
19.03.2013, 10:24
3 ответа

Вы могли передать вывод по каналу find через head:

find . -name '*.txt' | head -n 3
22
27.01.2020, 19:47
  • 1
    я знал это, я хочу, выходят из процесса поиска после обнаружения первых трех подобранных файлов. Может быть огромная сумма подобранных файлов, о которых я не забочусь. –  mitnk 19.03.2013, 10:31
  • 2
    я думаю команда находки, действительно становится завершенным, после того как голова распечатала первые 3 файла –  Chris Card 19.03.2013, 10:48
  • 3
    Да, это странно, но Вы правы. –  mitnk 19.03.2013, 11:22
  • 4
    Это нисколько не странно - это - как каналы работают в UNIX. head запускает и ожидает входа с левой стороны канала. Затем find запускает и ищет файлы, которые соответствуют указанным критериям, отправляя его вывод через канал. Когда head получил и распечатал количество строк, которые требуют, оно завершается, закрывая канал. find замечает закрытый канал, и он также завершается. Простой, изящный и эффективный. –  D_Bye 19.03.2013, 11:37
  • 5
    Подводя итоги, -n 3 совместимый POSIX, и поэтому вероятно, быть более портативным. –  l0b0 19.03.2013, 18:11

Этот другой ответнесколько некорректен. Команда

найти. -имя '*.txt' | голова -n 3

Затем есть объяснение в одном из комментариев[курсив мой]:

головазапускается и ожидает ввода с левой стороны пайпа. Затем запускается 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
11
27.01.2020, 19:47

Решение без find, которое может сработать для многих, состоит в том, чтобы использовать вместо него fd, похожий на find -инструмент, написанный на Rust.(fd — это простая, быстрая и удобная -альтернатива поиску)

fd --glob '*.txt' /path/to/search --max-results $n
1
31.10.2021, 15:30

Теги

Похожие вопросы