2012-05-16 45 views
4

我想做一个递归的grep。因此,通常我会执行以下操作:如何在路径中存在一个FIFO时递归地grep

grep pattern -r /some/path 

通常这会起作用。但是,当路径中存在一个FIFO文件时,grep将停留在那里。

[email protected]_54_sles10:~/tmp$ ls -l 1 
prw-r--r-- 1 neoli users 0 2012-05-16 17:24 1 

然后我打电话strace命令来确定问题,我得到了这个。

... 
stat64("./1", {st_mode=S_IFIFO|0644, st_size=0, ...}) = 0 
open("./1", O_RDONLY|O_LARGEFILE) = 3 
read(3, <unfinished ...> 

所以我的问题是如何做一个递归grep的时候有一个FIFO的路径? grep有一个命令行选项,它会告诉grep在指定时忽略FIFO吗?

感谢您的善意帮助。

回答

5

man grep(GNU)

-D ACTION, --devices=ACTION 

    If an input file is a device, FIFO or socket, use ACTION to process it. 
    By default, ACTION is read, which means that devices are read just as if 
    they were ordinary files. If ACTION is skip, devices are silently skipped. 
2

一种方法是使用find

find . -type f -exec grep pattern {} \; 

这将仅适用于常规文件(所以没有符号链接,管道等模式的grep )

+0

这对FreeBSD很有用,它包含旧的GNU grep,即使提供了'-D skip',也不会跳过FIFO。 – WGH