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.*"

如何找到名字是8个数字的文件夹

find . -type d -regextype posix-egrep -regex '.*/[0-9]{8}'

locate

locate默认用的wildcards,用locate -r可以用基本正则表达式,用locate --regex可以用扩展的正则表达式。