Grep индикатор выполнения с помощью PV (труба просмотра)
У меня есть огромный каталог на моем компьютере, и мне нужно искать в каждом файле ruby внутри строки.
Я мог бы сделать это так: grep -R "string" *.rb
но это занимает очень много времени, и я хотел бы использовать PV (просмотрщик каналов), чтобы показать индикатор выполнения, чтобы иметь возможность контролировать grep
прогресс.
Но я действительно не знаю, как я могу написать эту команду, потому что есть некоторые вещи, которые я просто не могу понять об этой команде.
У кого-нибудь есть идеи?
6 ответов
pv
работает на каналах (не на командах) - это индикатор громкости, показывающий, сколько данных прошло заданную точку в конвейере.
Ваша команда grep не является конвейером (|
- pipe operator
нигде не найти) - это всего лишь одна команда, делающая свое дело. pv
не могу помочь тебе здесь, ты просто должен доверять этому grep
на самом деле делает свое дело на всех входных файлов.
Вы можете что-то сделать вместе с find, pv, xargs & grep (find . -name "*.rb" | pv | xargs grep [regex]
Похоже, это может быть многообещающим, но вы должны сказать pv
насколько большой find
выход для него, чтобы дать значимые результаты.
Честно говоря, это кажется больше работы, чем стоит. Просто запустите ваш grep, терпеливо ждите и разберитесь с выводом, когда это будет сделано.
Еще два метода:
for file in *.rb; do echo $file; grep "string" $file >> output.txt; done
Или в другой оболочке во время выполнения исходной команды найдите pid команды grep и затем:
strace -q -s 256 -e trace=open -p [pid] 2>&1 | head
Оба вышеперечисленных покажут вам, над каким файлом работает команда grep. Вы можете найти общее количество файлов с:
ls -l *.rb | wc -l
Наконец, используйте это, чтобы выяснить, какой номер текущий файл в списке:
ls -l *.rb | grep -n [the current filename]
PS Мои ответы предполагают, что все ваши файлы находятся в одном каталоге. Если это не так, вам придется использовать find
вместо ls
а также *.rb
как предположил тонкий.
Я не уверен, какую ОС вы используете, но grep -R "string" *.ext
может работать неправильно для вас.
Вы могли бы быть лучше поданы, используя find
в сочетании с grep
:
find . -type f -name "*.rb" -print0 |xargs --null grep "string"
В последних версиях pv
есть "-d"
-Возможность просмотра всех FD другого процесса.
Так в теории pv
будет работать не только как труба, но и как индикатор прогресса для всего процесса. (Например, попробуйте с PID вашего Firefox)
Для приведенной выше проблемы более простая идея заключается в следующем: grep
работает, использовать lsof
вместе с watch
,
$ watch -n 1 "lsof | grep -n $PWD"
Таким образом, вы можете отслеживать прогресс вашего grep.
Ты уже пробовал
grep -R "string" *.rb | pv
Я не знаю, работает ли он на самом деле, потому что он не знает, сколько битов общего объема данных искать, потому что он рекурсивный?
Я обычно использую proc-файловую систему в системах Linux, т.е.
ls -al /proc/<pid of grep>/fd
В этом списке перечислены все файлы, открытые в данный момент с помощью grep-invocation, и, таким образом, создается впечатление о том, где в поиске он находится в данный момент.