遵循下面的建议这问题,我可以递归地 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" {} \+