如何递归地grep当前目录内容,省略所有隐藏目录?

如何递归地grep当前目录内容,省略所有隐藏目录?

遵循下面的建议问题,我可以递归地 grep 查找给string定目录内容中的字符串dir,如下所示

grep -r --exclude-dir='.*' string dir

但是,当我将其应用于当前目录时,如

$ grep -r --exclude-dir='.*' string .
$ 

我没有得到任何结果,因为该--exclude-dir='.*'选项将当前目录忽略为隐藏,因为它匹配'.*'.

解决方法是通过 更改到父目录cd ..,然后在适当的子目录上运行命令,然后cd再次返回到原​​始工作目录。必须有一个命令可以用来执行此操作,而无需更改目录的解决方法。

grep 当前目录的内容并忽略隐藏目录的内容的单个命令是什么?

答案1

如果您使用 GNU grep 2.11 或更高版本,-r如果未指定目录,将从当前目录开始:

grep -r --exclude-dir='.*' string

答案2

在 shell glob(也称为文件名模式)中,.没有特殊含义,*表示零个或多个字符,并且?表示任何单个字符。

您要排除的是一个点,后跟最后一个字符,然后是任意数量的字符。所以使用:

grep -r --exclude-dir='.?*' string .

答案3

由于默认情况下bash不会grep遍历隐藏目录(即未dotglob启用:

$ tree -a
.
├── .test
│   ├── .file
│   └── file
├── file
└── test
    ├── .file
    └── file

2 directories, 5 files

$ grep -r foo *
file:foo
test/.file:foo
test/file:foo

只需排除隐藏文件:

$ grep --exclude=".*" -r foo *
file:foo
test/file:foo

答案4

在 a 内递归单身的目录(不限制子目录隐藏文件)使用:

正如echo dir/*将打印目录中的所有文件一样,这也适用于某些目录中的文件:

$ grep -r "string" $(echo dir/*)

只需更改dir.(点),您就会得到您想要的:

$ grep -r "string" $(echo ./*)

如果需要的是任何子目录中都没有隐藏文件,请使用:

$ grep -r --exclude-dir='.*' "string"

或者使用查找:

find . -not -path '*/\.*' -type f -exec grep "string" {} \+

相关内容