我运行命令在所有文件中搜索短语:
cat *.* | grep blabla
它运行正常,但我遇到了隐藏文件和目录的问题。命令根本无法处理它们。如何解决这个问题?
答案1
默认情况下,隐藏文件(即以句点开头的文件)被排除在 bash shell 的 glob 扩展之外。但是,您可以使用设置来更改这一点,dotglob
例如
$ mkdir dir
$ touch dir/.hidden dir/visible
$ echo dir/*
dir/visible
$ shopt -s dotglob
$ echo dir/*
dir/.hidden dir/visible
之后你可以使用以下命令取消设置选项shopt -u dotglob
答案2
使用find
带有逻辑或标志 ( -o
) 和-exec . . .\+
标志的命令
find . -maxdepth 1 \( -iname "*.*" -o -iname ".*" \) -exec grep "MySearchTerm" {} \+
解释:
find
是一个递归命令,用于在指定目录中搜索文件。在本例中,它是.
当前工作目录。-maxdepth
标志告诉我们只停留在当前目录中。如果你想要递归或指定要下降的子目录数,请更改1
为你想去的级别数。\( . . .\)
部分阻止 shell 将其视为子 shell,而是将其视为参数分组find
。-iname
标志允许指定要搜索的文件名。-o
标志将告诉 find 搜索文件*.*
或以前导点开头的文件,即隐藏文件。-exec . . .{}
结构允许运行特定命令来对找到的文件进行操作。\+
将告诉find
将所有文件作为要运行的命令的参数,在本例中是grep
。
这是一个小例子,您可以看到SEARCHFILE.txt
和.SEARCHFILE.txt
都位于:
DIR:/xieerqi
skolodya@ubuntu:$ find . -maxdepth 1 \( -iname "*.*" -o -iname ".*" \) -exec grep "HelloWorld" {} \+ 2>/dev/null
./SEARCHFILE.txt:HelloWorld ! I'm found
./localDir.txt:HelloWorld.so
./localDir.txt:HelloWorld.c
Binary file ./2015-05-05-raspbian-wheezy.img matches
./.SEARCHFILE.txt:HelloWorld ! I'm found