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