find 命令
用于在文件树中查找文件,并作出相应的处理。
命令格式:
find pathname \-options \[-print \-exec \-ok ...\]
命令参数:
pathname: |
find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 |
-print: |
find命令将匹配的文件输出到标准输出。 |
-exec: |
find命令对匹配的文件执行该参数所给出的shell命令。 相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。 |
-ok: |
和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令, 在执行每一个命令之前,都会给出提示,让用户来确定是否执行。 |
命令选项:
选项 |
作用 |
-name |
按照文件名查找文件 |
-perm |
按文件权限查找文件 |
-user |
按文件属主查找文件 |
-group |
按照文件所属的组来查找文件。 |
-type |
查找某一类型的文件,诸如: |
b - |
块设备文件 |
d - |
目录 |
c - |
字符设备文件 |
l - |
符号链接文件 |
p - |
管道文件 |
f - |
普通文件 |
-size n :[c] |
查找文件长度为n块文件,带有c时表文件字节大小 |
-amin n |
查找系统中最后N分钟访问的文件 |
-atime n |
查找系统中最后n*24小时访问的文件 |
-cmin n |
查找系统中最后N分钟被改变文件状态的文件 |
-ctime n |
查找系统中最后n*24小时被改变文件状态的文件 |
-mmin n |
查找系统中最后N分钟被改变文件数据的文件 |
-mtime n |
查找系统中最后n*24小时被改变文件数据的文件 |
-maxdepth n |
最大查找目录深度 |
-prune |
选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略 |
-newer |
如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项 |
(用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。 )
实例:
查找 48 小时内修改过的文件
find \-atime \-2
在当前目录查找 以 .log 结尾的文件。 . 代表当前目录
find ./ \-name '\*.log'
查找 /opt 目录下 权限为 777 的文件
find /opt \-perm 777
查找大于 1K 的文件
find \-size +1000c
查找等于 1000 字符的文件
find \-size 1000c
-exec 参数后面跟的是 command 命令,它的终止是以 ; 为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。{} 花括号代表前面find查找出来的文件名。
实例:
在当前目录中查找更改时间在10日以前的文件并删除它们(无提醒)
find . \-type f \-mtime +10 \-exec rm \-f {} \\;
当前目录中查找所有文件名以.log结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。 按y键删除文件,按n键不删除
find . \-name '\*.log' mtime +5 \-ok \-exec rm {} \\;
当前目录下查找文件名以 passwd 开头,内容包含 "pkg" 字符的文件
find . \-f \-name 'passwd\*' \-exec grep "pkg" {} \\;
用 exec 选项执行 cp 命令
find . \-name '\*.log' \-exec cp {} test3 \\;
-xargs find 命令把匹配到的文件传递给 xargs 命令,而 xargs 命令每次只获取一部分文件而不是全部,不像 -exec 选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
实例:
查找当前目录下每个普通文件,然后使用 xargs 来判断文件类型
find . \-type f \-print | xargs file
查找当前目录下所有以 js 结尾的并且其中包含 'editor' 字符的普通文件
find . \-type f \-name "\*.js" \-exec grep \-lF 'ueditor' {} \\;
find \-type f \-name '\*.js' | xargs grep \-lF 'editor'
利用 xargs 执行 mv 命令
find . \-name "\*.log" | xargs \-i mv {} test4
用 grep 命令在当前目录下的所有普通文件中搜索 hostnames 这个词,并标出所在行:
find . \-name \\\*(转义) \-type f \-print | xargs grep \-n 'hostnames'
查找当前目录中以一个小写字母开头,最后是 4 到 9 加上 .log 结束的文件:
find . \-name '\[a-z\]\*\[4-9\].log' \-print
在 test 目录查找不在 test4 子目录查找
find test \-path 'test/test4' \-prune \-o \-print
实例:查找更改时间比文件 log2012.log新但比文件 log2017.log 旧的文件
find \-newer log2012.log ! \-newer log2017.log
使用 depth 选项
depth 选项可以使 find 命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。
实例:find 命令从文件系统的根目录开始,查找一个名为 CON.FILE 的文件。 它将首先匹配所有的文件然后再进入子目录中查找
find / \-name "CON.FILE" \-depth \-print