2

Я пытался собрать все Message-ID: заголовки (строки) в каталоге с файлами 200K .eml (простой текст). Я немного наивно сказал:

find -type f -exec grep -Fi "message-id:" {} \; > messageids.txt

Я позволил ему работать в одночасье, так как я подумал, что потребуется время, чтобы просмотреть столько файлов. К моему удивлению этим утром, messageids.txt составляет 1,7 ТБ, и мой раздел заполнен. Я понимаю, что, должно быть, произошло то, что собственный вывод grep воспринимается как ввод, но я бы не стал (и все еще не буду интуитивно) ожидать, что он будет повторяться бесконечно. Это означает, что мое понимание действующих сил не так сильно, как должно быть.

Может ли кто-нибудь дать подробное объяснение того, как работает вышеприведенная команда и почему следует ожидать (я предполагаю) этого бесконечного цикла? Благодарю.

Обновление: я ожидаю, что это сработает, так как find находит список файлов, и для каждого из них вызывается grep. Так что в какой-то момент grep вызывается на messageids.txt. Если бы я сделал это, скажем, с помощью команды сортировки, messageids.txt был бы создан, как только команда будет выполнена (возможно, ударить ее, если она уже существует), но она не будет заполнена, пока команда не завершится. В этом случае, чтобы цикл был бесконечным, файл должен заполняться до завершения вывода, но таким образом, чтобы ввод из grep постоянно следил за ним. Это то, что не ведет себя так, как я ожидал, и я надеялся получить подробное объяснение того, как работает эта цепочка процессов, чтобы я мог укрепить свои основы Linux.

2 ответа2

3

Каждый раз, когда он находит строку с message-id , он вскоре записывает ее в messageids.txt . И каждый раз, когда он записывает строку с message-id в messageids.txt , он вскоре находит ее. Так что это тривиальный бесконечный цикл.

0

Я только что проверил что-то вроде этого, и это сработало.

for f in $(find . -type f); do grep -Fi "message-id:" $f > messageids.txt; done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .