У меня на компьютере огромный каталог, и мне нужно искать строку в каждом рубиновом файле внутри.
Я мог бы сделать это так: grep -R "string" *.rb
но это занимает очень много времени, и я хотел бы использовать pv (просмотрщик каналов), чтобы показать индикатор выполнения, чтобы иметь возможность контролировать grep
прогресс.
Но я действительно не знаю, как мне написать эту команду, потому что есть еще некоторые вещи, которые я просто не могу понять в этой команде.
Есть у кого-нибудь идеи?
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]
P.S. Мои ответы предполагают, что все ваши файлы находятся в одном каталоге. Если это не так, вам придется использовать find
вместо того ls
и *.rb
как предложил тонкий.
Я не уверен, какую ОС вы используете, но grep -R "string" *.ext
может работать некорректно для вас.
Возможно, вам лучше использовать find
в сочетании с grep
:
find . -type f -name "*.rb" -print0 |xargs --null grep "string"
В последних версиях pv
есть "-d"
-Возможность смотреть все ФД другого процесса.
Так что теоретически 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, что дает представление о том, где он находится в поиске.