shell学习笔记二:find 和xargs
1. find命令
find pathname -options [-print -exec -ok]
pathname find命令所查找的目录路径。
-print find命令将匹配的文件输出到标准输出。
-exec find命令对匹配的文件执行该参数所给出的s h e l l命令。
-ok 和- e x e c的作用相同,只不过以一种更安全的方式执行.
ex
使用name选项
$ find ~ -name "*.txt" –print
不管你现在在什么目录中,在自己的根目录中按文件名查找所有以”.txt”结尾的文件,输出到标准输出
~代表了你的$home目录
$ find . -name "[A-Z]*" –print
在当前目录及子目录中查找文件名以一个大写字母开头的文件
$ find /etc -name "host*" –print
在/etc目录中查找以”host”开头的文件
$ find / -name "*" –print
从根目录开始查找所有的文件
$ find . -name "[a-z][a-z][0--9][0--9].txt" –print
从当前目录及其子目录中查找以两个小写字母开头,跟着两个数字,并且以.txt结尾的文件
使用perm选项
$ find . -perm 755 –print
在当前目录下查找文件权限为755的文件
$ find . -perm -007 –print
在当前目录下查找所有用户都可读写执行的文件(小心这种情况,find可能执行较长时间)
忽略某个目录
$ find /apps -name "/apps/bin" -prune -o –print
希望在/ a p p s目录下查找文件,但不希望在/ a p p s / b i n目录下查找
我运行之后好像不对,此处有疑问 ?
使用user和nouser选项
$ find ~ -user dave –print
$ find /etc -user uucp –print
$ find /home -nouser –print
在/home目录中查找账户已经被删除的文件
使用group和nogroup选项
$ find /apps -group accts –print
$ find / -nogroup –print
从文件系统的根目录处查找没有有效所属用户组的所有文件
按照更改时间查找文件
$ find / -mtime -5 –print
在系统根目录下查找更改时间在5日以内的文件
$ find /var/adm -mtime +3 –print
在/ v a r / a d m目录下查找更改时间在3日以前的文件
查找比某个文件新或旧的文件
$ find –newer oldfile.txt ! –newer newfile.txt
按字面意思一个可理解,即找比oldfile.txt newer的文件,而不比newfile.txt newer的文件,也就是比oldfile新比newfile旧的文件
查找更改时间在两个小时以内的文件(假设现在是12月21日12点半)
1. touch –t 12211030 dstamp 创建一个时间戳为12月21日10点半的文件
2. ls –l dstamp
3. $ find . -newer dstamp –print
使用type选项
$ find /etc -type d –print
在/ e t c目录下查找所有的目录
$ find . ! -type d –print
在当前目录下查找除目录以外的所有类型的文件
$ find /etc -type l –print
在/ e t c目录下查找所有的符号链接文件
使用size选项
$ find . -size +1000000c –print
在当前目录下查找文件长度大于1 M字节的文件
$ find /home/apache -size 100c –print
在/ h o m e / a p a c h e目录下查找文件长度恰好为1 0 0字节的文件
$ find . -size +10 –print
在当前目录下查找长度超过1 0块的文件(一块等于5 1 2字节)
使用depth选项
$ find / -name "CON.FILE" -depth –print
从文件系统的根目录开始,查找一个名为C O N . F I L E的文件。
它将首先匹配所有的文件然后再进入子目录中查找。
使用mount选项
$ find . -name "*.XC" -mount -print
从当前目录开始查找位于本文件系统中文件名以X C结尾的文件(不进入其他文件系统)
使用cpio选项
c p i o命令可以用来向磁带设备备份文件或从中恢复文件。可以使用f i n d命令在整个文件系
统中(更多的情况下是在部分文件系统中)查找文件,然后用c p i o命令将其备份到磁带上。
如果希望使用c p i o命令备份/ e t c、/ h o m e和/ a p p s目录中的文件,可以使用下面所给出的命
令,不过要记住你是在文件系统的根目录下:
$ cd /
$ find etc home apps –depth –print | cpio –ivcdc65536 –o \
/dev/rmt0
(在上面的例子中,第一行末尾的\告诉s h e l l命令还未结束,忽略\后面的回车。)
在上面的例子中,应当注意到路径中缺少/。这叫作相对路径。之所以使用相对路径,是
因为在从磁带中恢复这些文件的时候,可以选择恢复文件的路径。例如,可以将这些文件先
恢复到另外一个目录中,对它们进行某些操作后,再恢复到原始目录中。如果在备份时使用
了绝对路径,例如/ e t c,那么在恢复时,就只能恢复到/ e t c目录中去,别无其他选择。在上面
的例子中,我告诉f i n d命令首先进入/ e t c目录,然后是/ h o m e和/ a p p s目录,先匹配这些目录下
的文件,然后再匹配其子目录中的文件,所有这些结果将通过管道传递给c p i o命令进行备份。
顺便说一下,在上面的例子中c p i o命令使用了C 6 5 5 3 6选项,我本可以使用B选项,不过这
样每块的大小只有5 1 2 字节,而使用了C 6 5 5 3 6 选项后,块的大小变成了6 4 K 字节
(6 5 5 3 6 / 1 0 2 4)。
使用exec或ok来执行shell命令
e x e c选项后面跟随着所要执行的命令,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用e x e c选项,必须要同时使用p r i n t选项。
$ find . –type f –exec ls –l {} \;
$ find logs -type f -mtime +5 -exec rm {} \;
在/ l o g s目录中查找更改时间在5日以前的文件并删除它们
在s h e l l中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!
$ find . –name “*.log” –mtime+5 –ok rm {} \;
在当前目录中查找所有文件名以. L O G结尾、
更改时间在5日以上的文件,并删除它们,在删除之前先给出提示。
$ find /etc –name “password*”-exec grep “rounder”{} \;
匹配所有文件名为“ p a s s w d *”的文件,例如p a s s w d、p a s s w d . o l d、p a s s w d . b a k,然后执行g r e p命令看看在这些文件中是否存在一个r o u n d e r用户。
使用xargs
$ find . -name "core" -print | xargs echo "" >/tmp/core.log
在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中
$ find /apps/audit -perm -7 -print | xargs chmod o-w
子在/ a p p s / a u d i t目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:
$ find / -type f -print | xargs grep "device"
用g r e p命令在所有的普通文件中搜索d e v i c e这个词
$ find . -name *\-type f -print | xargs grep "DBO"
用g r e p命令在当前目录下的所有普通文件中搜索D B O这个词,\用来取消f i n d命令中的*在s h e l l中的特殊含义