find命令
find命令的一般形式为:
find pathname -options [-print -exec -ok]
其中:
pathname: find命令所查找的目录路径。用 . 来表示当前路径,用 / 来表示系统根目录;
-print:find命令将匹配的文件标准输出
-exec:find命令对匹配的文件执行该参数给出的shell命令。相应命令的形式为’command’ {} \;,注意{}和\;之间的空格
-ok:和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
至于options,列举了几个常用的:
-name:按照文件名查找文件。
-perm: 使用文件权限来查找文件。
-prune:使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用了-depth选项,那么-prune选项将被find命令忽略。
-user:按照文件属主来查找文件
-mtime -n +n :安装文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前,
-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
-type 查找某一类型的文件,f-普通文件,d-目录
-size n[c]:查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth:在查找文件时,首先查找当前目中的文件,然后再在其子目录中查找
下面用实例来说明:
1.在当前目录及其子目录中查找文件名以’.txt’结尾的文件
$ find . -name "*.txt" -print
2.在/home/baby目录及其子目录中查找文件名以大写字母开头的文件
$ find /home/baby -name "[A-Z]*" -print
3.在当前目录及其子目录中查找文件名以两个小写字母开头,跟着是 两个数字,最后以*.txt结尾的文件,比如名为 ‘ab11_fs124.txt’ 的文件
$ find . -name "[a-z][a-z][0-9][0-9]*.txt" -print
4.在当前目录及其子目录下查找文件权限为755的文件
$ find . -perm 755 -print
5.打印在当前目录或者低于当前目录的所有文件的路径名称,这其中不包括名为app或者在app目录中的目录:
$ find . -name app -prune -0 -print
6.列出在当前目录中在当前24小时内更改过的文件:
$ find . ctime 1 -print
7.列出在当前目录中更改时间在5日以内的文件:
$ find / -mtime -5 -print
若改为在5日以前,-5改为+5即可
8.在/etc目录下查找所有的目录
$ find /etc -type d -print
如果查找除目录之外的其他类型文件,在-type参数前加“!”即可
9.在当前目录下查找文件长度大于66字节的文件
$ find . size +66c -print
10.当前目录中查找所有文件名以.log结尾的文件,并删除它们
$ find . -name "*.log" -exec rm {} \;
11.继续上个问题,如果在删除之前先询问提示一下再删除:
$ find . -name "*.log" -ok rm {} \;
12.在当前目录查找更改时间比文件a.log新但是比文件b.log旧的文件
$ find . -newer a.log ! -newer b.log -exec ls -l {} \;
xargs命令
使用find命令的-exec 选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。不幸的是,有些系统能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”,这就是xargs命令的用处所在,特别是与find命令一起使用。find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发出一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程另外在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
下面用具体的例子来看xargs命令是如何与find命令同用的:
1. 在当前目录 下的普通文件中搜索“read”这个词:
$ find . -type f -print | xargs grep "read"
2.在当前目录中查找以”.txt”结尾的文件,然后把查询的结果保存到cc.log文件中:
$ find . -name "*.txt" -print |xargs echo "" >cc.log
3.在当前目录下查找所有用户权限为755的文件,并收回相应的写权限:
$ find . -perm 755 -print | xargs chmod o-w