我在获取匹配的文件名方面没有问题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
在本例中)。