使用 Grep 在文件系统上的文件中查找字符串

Dei*_*dre 2 grep find

我需要对文件系统中的多个文件进行搜索以查找字符串“RUSH2112”。我已经完成了以下命令,但是我不确定这是否正确。我站在挂载的文件系统中。

find . -type f -exec grep -i1 "Rush2112" {} \; 
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 6

要在不考虑大小写的情况下查找字符串(不是正则表达式),请使用grep -iF STRING(where STRINGshould be the quoted string you are looking)。

要递归目录层次结构中的所有常规文件,请执行

find . -type f -exec grep -iF STRING /dev/null {} +
Run Code Online (Sandbox Code Playgroud)

这与您的命令之间的主要区别在于,这将对grep找到的文件组执行。您的命令将为grep每个找到的文件运行一次,如果有很多文件,这可能会变慢。这是+在使这种差异的结束。

另一个区别是,由于grep使用多个文件调用,因此其输出将包含找到匹配项的文件的路径名。的/dev/null是有没有强制这一行为的情况下grep发生,只有一个文件被调用。如果您的实现具有非标准(但常见)选项,则可以使用grep's-H选项而不是包括。/dev/nullgrep

的某些实现grep还可以选择自行递归目录,而无需find. 这通常通过一个-R选项来完成:

grep -R -iF STRING .
Run Code Online (Sandbox Code Playgroud)

请注意,GNUgrep也有一个-r与其-R选项略有不同的选项(使用-r, 符号链接将不会被跟随,这将更接近地模拟您通过运行获得的行为grepvia find . -type f)。


如果您所追求的只是找到包含字符串的文件的路径名,而不一定是那些匹配的文件中的实际行,那么您可以通过多种不同的方式来做到这一点(所有这些都在很大程度上类似于上面提到的)。

如果您想对包含给定字符串的文件进行进一步处理,那么我将使用这些替代方案中的第一个:

find . -type f -exec grep -qiF STRING {} ';' -exec sh -c '
    for pathname do
        # Process "$pathname" here
    done' sh {} +
Run Code Online (Sandbox Code Playgroud)

或者,执行grep内嵌脚本:

find . -type f -exec sh -c '
    for pathname do
        if grep -qiF STRING "$pathname"; then
            # Process "$pathname" here
        fi
    done' sh {} +
Run Code Online (Sandbox Code Playgroud)

有关的: