Включите xtrace глобально:
> set -x; a a.mp3 a.m4 ; set +x
или включите xtrace для функций, затем выполните его:
> typeset -tf a # turns on xtrace for function a and below
> a a.mp3 a.m4
> typeset -Tf a # turns on xtrace for function a only
> a a.mp3 a.m4
Это можно сделать в определенный момент времени с помощью lsof
,даже на уже работающем -grep
, хотя он не будет постоянно печатать файлы по мере их поступления.
Сначала получите PID запущенного grep
процесса:
$ pgrep -l grep
21531 grep
Затем перечислите все открытые файлы этого процесса:
$ lsof -p 21531
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
grep 21531 izkata cwd DIR 253,1 4096 22020097 /var
grep 21531 izkata rtd DIR 253,1 4096 2 /
grep 21531 izkata txt REG 253,1 219456 22544390 /bin/grep
grep 21531 izkata mem REG 253,1 3004224 11805539 /usr/lib/locale/locale-archive
grep 21531 izkata mem REG 253,1 144976 29104688 /lib/x86_64-linux-gnu/libpthread-2.27.so
grep 21531 izkata mem REG 253,1 2030544 29104673 /lib/x86_64-linux-gnu/libc-2.27.so
grep 21531 izkata mem REG 253,1 14560 29104676 /lib/x86_64-linux-gnu/libdl-2.27.so
grep 21531 izkata mem REG 253,1 464824 29103098 /lib/x86_64-linux-gnu/libpcre.so.3.13.3
grep 21531 izkata mem REG 253,1 170960 29104669 /lib/x86_64-linux-gnu/ld-2.27.so
grep 21531 izkata mem REG 253,1 26376 12064533 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
grep 21531 izkata 0u CHR 136,8 0t0 11 /dev/pts/8
grep 21531 izkata 1u CHR 136,8 0t0 11 /dev/pts/8
grep 21531 izkata 2u CHR 136,8 0t0 11 /dev/pts/8
grep 21531 izkata 3r DIR 253,1 4096 22020408 /var/lib
grep 21531 izkata 4r REG 253,1 35765 22156714 /var/lib/dpkg/info/systemd.md5sums
grep 21531 izkata 5r DIR 253,1 4096 22020692 /var/lib/dpkg
grep 21531 izkata 6r DIR 253,1 471040 22021003 /var/lib/dpkg/info
В основном это просто то, что grep
нужно запустить, но последние 4 строки являются каталогами, а файл grep
в данный момент читается(/var/lib/dpkg/info/systemd.md5sums
в этом примере ).
Перед началом поиска необходимо вызвать отдельные grep
процессы вместе с печатью имени файла. Конечно, это будет медленнее, но в вашем случае, так как grep
имеет крошечное время начальной загрузки, это не будет вас беспокоить по сравнению с текущей ситуацией.
Использование find и exec:
find. -type f -exec sh -c 'printf "checking: %s\n" "$1"; grep pattern "$1"' sh {} \;
Или найти и массово выполнить, чтобы вызвать одну оболочку для цикла
find. -type f -exec sh -c 'for f do printf "checking: %s\n" "$f"; grep pattern "$f"; done' sh {} +
Или используя find и xargs, с нулевым разделением GNU для файловых аргументов:
find. -type f -print0 | xargs -0 sh -c 'for f do printf "checking: %s\n" "$f"; grep pattern "$f"; done'
Кстати, как я вижу, вы используете macOS, рассмотрите возможность установки программного обеспечения GNU для grep, sed, awk и т. д.
С zsh
(, который, как я понимаю, теперь является интерактивной оболочкой по умолчанию в macOS ), вы можете сделать:
for f (**/*(ND-.)) (set -x; grep pattern $f)
(где set -x
, сокращение от set -o xtrace
, выводит команду, которая выполняется на stderr, как и во всех оболочках POSIX, а **/*(ND-.)
рекурсивно ищет все обычные файлы после разрешения символической ссылки, включая скрытые ).
С GNU или FreeBSD xargs
(, надеюсь, и с macOS ), вы могли бы сделать что-то подобное с:
find. -type f -print0 | xargs -0tn1 grep pattern
(, где опция -t
эквивалентнаxtrace
)
Это не рассматривает символические ссылки на обычные файлы, хотя (GNU find
имеет -xtype f
для этого, но не FreeBSD ). Независимо от того, просматривает ли grep -r
символические ссылки на обычные файлы, зависит от реализации и версии grep
, вы можете дважды проверить -со своей.
Они запускают по одному grep
на файл, поэтому они менее эффективны, чем grep -r
.
Другим подходом может быть использование трассировщика системных вызовов, такого как strace
/ truss
/ dtruss
/ tusc
или аналогичный в вашей macOS, и отслеживание open()
или openat()
или любого другого системного вызова. grep
используется для открытия файлов.
В GNU/Linux,это было бы:
strace -e open,openat grep -r pattern.
Я не знаю, что будет эквивалентно в macOS.