Finding Files
grep
grep的-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.*"
find . -type d -regextype posix-egrep -regex '.*/[0-9]{8}'
locate
locate默认用的wildcards,用locate -r可以用基本正则表达式,用locate --regex可以用扩展的正则表达式。