Я использую locate(1)
GNU findutils для небольшой задачи, и похоже, что он буферизует свой вывод. Я передаю вывод locate в другую задачу, которая будет обрабатывать строки по мере их нахождения locate. Поскольку выполнение locate может занять много времени, я думал, что locate будет выводить файлы по мере их нахождения, но похоже, что locate буферизует вывод.
Если я запускаю locate на TTY, он немедленно выводит первое совпадение и тратит около 10 секунд на поиск остальных совпадений.
Если вместо этого я запущу locate, но перейду на cat, то ничего не увижу, пока вся команда не будет выполнена.
Похоже, locate буферизует вывод и не имеет возможности отключить его.
Я хочу найти несколько файлов и сразу после их нахождения выполнить команду, передав вывод по конвейеру.
locate something | xargs -n 1 do_something
Но происходит следующее: xargs и, следовательно, do_something не вызываются до тех пор, пока find не завершится.
решение1
Конечно, я нашел ответ сразу после публикации, впост, предложенный stackexchange при публикации.
unbuffer
(из ожидаемого) решает эту проблему.
unbuffer locate something | xargs -n 1 do_something
выполняет команды так быстро, как только locate их находит.
решение2
locate
буферизует поток STDOUT, необходимо сделать STDOUT locate
небуферизованным (или построчно буферизованным).
Если вы используете систему GNU, вы можете использовать stdbuf
(входит в состав GNU coreutils
).
Чтобы сделать STDOUT locate
небуферизованным:
stdbuf -o0 locate something | ...
Линия буферизована:
stdbuf -oL locate something | ...
Проверьте man stdbuf
, чтобы получить больше информации.