我需要对文件系统中的多个文件进行搜索以查找字符串“RUSH2112”。我已经完成了以下命令,但是我不确定这是否正确。我站在挂载的文件系统中。
find . -type f -exec grep -i1 "Rush2112" {} \;
Run Code Online (Sandbox Code Playgroud)
要在不考虑大小写的情况下查找字符串(不是正则表达式),请使用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)。
如果您所追求的只是找到包含字符串的文件的路径名,而不一定是那些匹配的文件中的实际行,那么您可以通过多种不同的方式来做到这一点(所有这些都在很大程度上类似于上面提到的)。
使用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)
有关的: