grep - 打印 grep 当前正在搜索的文件的文件名

grep - 打印 grep 当前正在搜索的文件的文件名

我在获取匹配的文件名方面没有问题grep,但是,我正在搜索的文件层次结构中的某些内容需要永远(数小时)才能搜索(在一台计算机上的 2000 个文件中有 1.4 GB 数据) SSD,所以应该不会花那么长时间),我想知道是什么。因此,我想要某种冗长的输出,其中 grep 列出处理文件时的每个文件。

如何才能做到这一点?

在 Mac 上使用 BSD grep。

答案1

您必须调用单独的grep进程,并在开始搜索之前打印文件名。当然,这会比较慢,但就您的情况而言,由于grep启动加载时间很短,与当前情况相比,它不会打扰您。

使用查找和执行:

find . -type f -exec sh -c 'printf "checking: %s\n" "$1"; grep pattern "$1"' sh {} \;

或者查找并批量执行,以调用一个 shell 进行循环

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 等。

答案2

使用zsh(据我所知,它现在是 macOS 上的默认交互式 shell),您可以执行以下操作:

for f (**/*(ND-.)) (set -x; grep pattern $f)

(其中set -x, 的缩写set -o xtrace打印在 stderr 上执行的命令,就像在所有 POSIX shell 中一样,并**/*(ND-.)在符号链接解析后递归查找所有常规文件,包括隐藏文件)。

使用 GNU 或 FreeBSD xargs(希望 macOS 也是如此),您可以执行类似的操作:

find . -type f -print0 | xargs -0tn1 grep pattern

(其中该-t选项的作用相当于xtrace

不过,这并没有考虑到常规文件的符号链接(GNUfind-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 上的等效项是什么。

答案3

这可以在某个时间点完成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在本例中)。

相关内容