grepgrep 的-R 参数可以递归查找每个目录下的所有文件,但是有一点要注意。如果想递归查找当前目录下所有文件名包含“foo ”的HTML文件(假设HTML文件的扩展名只有.html),用
grep -R foo *.html
可能找不到需要的文件。打开Bash的set -x 选项都执行,看到这条命令被Bash展开后,*.html 变成了当前目录下所有以".html"结尾的文件(不包括隐藏文件),子目录里面HTML文件是找不到的。 如果用 grep -R foo *
* 被展开成了当前目录下的所有文件,也包括子目录,就可以找到子目录的文件了。
-R 的迷惑性在于会以为包括了所有文件,可是这取决于Shell对文件参数的展开结果,而*.html 就让展开不包含子目录。最好用find :
find . -iname "*foo*.html"
find在家目录寻找和Empathy相关的文件用find . -name empathy是不行的,要不区分大小写才好: find . -iname empathy
-name 是Shell pattern匹配,这样要求文件名必须叫Empathy(不分大小写)。在不清楚准确的文件名的情况下,可在首尾加上* 通配符:
find . -iname "*empathy*"
-name 和-iname 只匹配文件的basename。-path 和-ipath 则会把/也当成普通字符搜索,可以在整个路径中匹配。 最强大的是用正则表达式(要在家目录),这样家目录下. 开头的目录都会被搜索到:find . -iregex "\./\..*/.*empathy.*"
如何找到名字是8个数字的文件夹: find . -type d -regextype posix-egrep -regex '.*/[0-9]{8}'
locatelocate 默认用的wildcards,用 locate -r 可以用基本 正则表达式,用 locate --regex 可以用扩展的正则表达式。 |