我需要对文件系统中的多个文件进行搜索以查找字符串“RUSH2112”。我已经完成了以下命令,但是我不确定这是否正确。我站在挂载的文件系统中。
find . -type f -exec grep -i1 "Rush2112" {} \;
Run Code Online (Sandbox Code Playgroud)
要在不考虑大小写的情况下查找字符串(不是正则表达式),请使用grep -iF STRING
(where STRING
should 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/null
grep
的某些实现grep
还可以选择自行递归目录,而无需find
. 这通常通过一个-R
选项来完成:
grep -R -iF STRING .
Run Code Online (Sandbox Code Playgroud)
请注意,GNUgrep
也有一个-r
与其-R
选项略有不同的选项(使用-r
, 符号链接将不会被跟随,这将更接近地模拟您通过运行获得的行为grep
via find . -type f
)。
如果您所追求的只是找到包含字符串的文件的路径名,而不一定是那些匹配的文件中的实际行,那么您可以通过多种不同的方式来做到这一点(所有这些都在很大程度上类似于上面提到的)。
使用grep -q
上的每个文件的测试:
find . -type f -exec grep -qiF STRING {} ';' -print
Run Code Online (Sandbox Code Playgroud)grep -l
跨组找到的文件使用find
:
find . -type f -exec grep -ilF STRING {} +
Run Code Online (Sandbox Code Playgroud)使用递归grep -l
:
grep -R -ilF STRING .
Run Code Online (Sandbox Code Playgroud)如果您想对包含给定字符串的文件进行进一步处理,那么我将使用这些替代方案中的第一个:
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)
有关的: