bash знайти xargs grep лише однією випадковістю


16

Можливо, це трохи дивно - а можливо, є й інші інструменти для цього, але, ну ..

Я використовую таку класичну команду bash, щоб знайти всі файли, що містять деяку рядок:

find . -type f | xargs grep "something"

У мене велика кількість файлів на декількох глибинах. Першого появи "чогось" мені достатньо, але пошук продовжується і потрібно тривати тривалий час, щоб заповнити решту файлів. Що я хотів би зробити, це щось на зразок "відгуку" від grep назад, щоб знайти, щоб пошук міг перестати шукати більше файлів. Чи таке можливо?

Відповіді:


20

Просто збережіть це в царині пошуку:

find . -type f -exec grep "something" {} \; -quit

Ось як це працює:

-execПрацюватиме , якщо -type fбуде правильно. А тому що grepповернення 0(успіх / правда), коли -exec grep "something"матч має збіг, -quitволя буде спрацьовувати.


8
find -type f | xargs grep e | head -1

робить саме так: коли headзакінчується, середній елемент труби повідомляється сигналом "зламана труба", припиняється по черзі і повідомляє про find. Ви повинні побачити повідомлення, як-от

xargs: grep: terminated by signal 13

що це підтверджує.


+1 для пояснення та альтернативи, хоча інша відповідь здається мені більш елегантною, оскільки вона є самодостатньою
hello_earth

8

Для цього без зміни інструментів: (я люблю xargs)

#!/bin/bash
find . -type f |
    # xargs -n20 -P20: use 10 parallel processes to grep files in batches of 20
    # grep -m1: show just on match per file
    # grep --line-buffered: multiple matches from independent grep processes
    #      will not be interleaved
    xargs -P10 -n20 grep -m1 --line-buffered "$1" 2> >(
        # Error output (stderr) is redirected to this command.
        # We ignore this particular error, and send any others back to stderr.
        grep -v '^xargs: .*: terminated by signal 13$' >&2
    ) |
    # Little known fact: all `head` does is send signal 13 after n lines.
    head -n 1

1
+1 ніколи не знав, що xargs матиме такі багатозадачні можливості - дякую також за інші коментарі! :)
hello_earth
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.