一般来说,find 是指查找文件,以文件名为依据,当然也可以指目录,而grep是查找字符串,以查找内容为主。当然二者还可以混合使用。
find 格式
find [path] [options] [tests] [actions]
几个简单例子
find . -name test.txt -print
find / -type d test
find . -name "test*"
find /bin /usr/bin -name test
可以看出来,路径可以是绝对路径,也可以是相对路径,同时也可以是多个路径,选项一般使用的比较少,测试就是这里所用的-name, -type 等,action一般是print,默认的就是打印出来,也可以使用其他的ls, -exec 等
更具体的参数:
主要的一些选项如下:
-depth 在查看目录本身以前要先搜索目录中的内容
-follow 跟随符号链接
-maxdepths N 在搜索一个目录时至多搜索N层
-mount(或-xdev) 不要搜索其他的文件系统
主要的一些测试项目如下:
-atime N N天以前访问的文件
-mtime N N天以前修改的文件
-name pattern 除了路径,与指定的类型匹配的文件名.为了保证指定的类型传递给find命令而并不是立即被Shell赋值,指定的类型必须用引号进行引用.用引号的时候,可以用匹配,也就是文件名模糊查找,否则认为是文件名精确查找
-newer otherfile 与otherfile文件相比要新的文件
-type C C类型的文件,而这里的C可以指定的一种类型.最常用的是d代表目录,而f是指普通的文件.对于其他的文件类型,我们可以查看手册页.
-user username 指定的用户所拥有的文件
我们也可以使用运算符进行测试的组合.大多数的有两种格式:短格式和长格式.
! -not 测试的反
-a -and 所有的测试必须为真
-o -or 测试中某一个为真
主要的一些动作为:
-exec command 执行一个命令.这是我们最常执行的动作.
-ok command 与-exec相类似,所不同的只是他会提示用户在执行将要执行的命令之前进行命令的确认.
-print 打印出文件名
-ls 使用ls命令列出当前的文件
-exec和-ok命令会同一行的参数子序列作为他的参数的一部分,直到遇到一个终结符/;序列.对于-exec和-ok来说字符串{}是珍上特殊的类型,而且会为当前文件的绝对路径所替换.
一个例子
find . -newer while2 -type f -exec ls -l {} /;
查找当前路径下,比while2要新的,并且是常规得文件,并按ls -l列出来
注意一个发现,-name 会递归到子目录,如果不想查找子目录,可以限定查找的深度加选项-maxdepths 1表示只在当前目录,不到子目录下找。
但是不知为什么,我测试的-newer只适用于当前目录,不进行子目录查找
grep
grep [options] PATTERN [FILES]
grep 用于查找文件中的字符串,功能非常强大,也可以和find合用,作为-exec得命令
常用例子
grep abc ./* 在当前路径下查找所有文件中含abc字符串的文件,并把行打印出来
选项主要有:
-c 打印出匹配行的总数,而不是打印出匹配的行
-E 打开扩展表达式
-h 禁止将在其中查找到匹配内容的文件名作为输出行的前缀
-i 忽略大小写
-l 列出带用匹配行的文件名,而不是输出实际的匹配行
-v 将匹配类型转换为选择不匹配的行而不是匹配的行
更复杂的匹配就要使用正则表达式
正则表达式中的一些特殊字符
^ 在一行的开头
$ 在一行的结尾
. 任意一个单一字符
[] 方括号中所包含是字母的范围,其中的任何一个都可以进行匹配,例如a-e的字母范围,或者是我们可以使用^来进行反义.
如果我们要将他们作为普通的字符来使用就要在这些字符前面加上/.所以如果我们要查找一个$字符,我们就要使用/$来进行查找.
还有一些扩展的匹配
? 可选的匹配,但是最多匹配一次
* 必须匹配0个或是多个项目
+ 必须匹配1个或是多个项目
{n} 必须匹配n次
{n,} 必须匹配n次或是更多次
{n,m} 匹配范围为n次到m次,包括m次
例子:
grep e$ test.txt
搜索以e结尾的匹配行
grep -E [a-z]/{10/} words2.txt
搜索查找10个字符长的小写字母的单词
更复杂的以后慢慢使用中了解