前提
Linux秉承着“一切皆文件”的哲学思想,当然这也是对linux文件系统的一种抽象说法,从设备驱动程序、目录、系统配置、内核参数到任务进程都是用文件来表示的。其中的任何事物,无论是纯文本文件(例如/etc/hosts)、块设备或字符设备驱动程序或者内核状态与配置(例如/proc/cpuinfo),他们都用文件的形式表示。 一切皆文件,这意味着从系统的一部分学到的原理可以适用于系统的其他部分。
所以怎么查找文件就显得非常重要了,今天我们就来详细的学习一下find命令的用法。
find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
语法
·find path -option [ -print ] [ -exec -ok command ] {} \
find (指定目录) (指定选项) [查找玩之后执行的动作 ]
常用选项
-amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
-anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
-atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
-cmin<分钟>:查找在指定时间之时被更改过的文件或目录;
-cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
-daystart:从本日开始计算时间;
-depth:从指定目录下最深层的子目录开始查找;
-expty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
-exec<执行指令>:假设find指令的回传值为True,就执行该指令;
-false:将find指令的回传值皆设为False;
-fls<列表文件>:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件;
-follow:排除符号连接;
-fprint<列表文件>:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件;
-fprint0<列表文件>:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件;
-fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件;
-fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
-gid<群组识别码>:查找符合指定之群组识别码的文件或目录;
-group<群组名称>:查找符合指定之群组名称的文件或目录;
-help或——help:在线帮助;
-ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
-iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
-inum<inode编号>:查找符合指定的inode编号的文件或目录;
-ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
-iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
-links<连接数目>:查找符合指定的硬连接数目的文件或目录;
-iname<范本样式>:指定字符串作为寻找符号连接的范本样式;
-ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
-maxdepth<目录层级>:设置最大目录层级;
-mindepth<目录层级>:设置最小目录层级;
-mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
-mount:此参数的效果和指定“-xdev”相同;
-mtime<24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
-name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-nogroup:找出不属于本地主机群组识别码的文件或目录;
-noleaf:不去考虑目录至少需拥有两个硬连接存在;
-nouser:找出不属于本地主机用户识别码的文件或目录;
-ok<执行指令>:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
-path<范本样式>:指定字符串作为寻找目录的范本样式;
-perm<权限数值>:查找符合指定的权限数值的文件或目录;
-print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串;
-print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
-printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
-prune:不寻找字符串作为寻找文件或目录的范本样式;
-regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-size<文件大小>:查找符合指定的文件大小的文件;
-true:将find指令的回传值皆设为True;
-typ<文件类型>:只寻找符合指定的文件类型的文件;
-uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
-used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
-user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
-version或——version:显示版本信息;
-xdev:将范围局限在先行的文件系统中;
-xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。
常用示例
find .
列出当前目录及子目录下所有文件和文件夹
- 按照文件名查找:
find /home -name "*.t?t" *表示通配任意个字符 ?表示通配单个字符
列出/home 目录下的以 .t t结尾的文件,两个t中间为一个字符。
- 按照文件时间戳查找:
首先我们先简要了解一下文件的时间戳的概念,可以用stat或者ls 命令查看文件的三个时间戳。
访问时间 | Access | atime |
修改时间 | Modify | mtime |
状态改动时间 | Change | ctime |
下面是man手册中给予的(+ - n)的解释:
我撷取了鸟哥linux私房菜中对正负号的解释:
图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。由图我们可以清楚的知道:
- +4代表大于等于5天前的档名:ex> find /var -mtime +4
- -4代表小于等于4天内的档案档名:ex> find /var -mtime -4
- 4则是代表4-5那一天的档案档名:ex> find /var -mtime 4
find /usr -mtime -4 查找文件更新日时在距现在时刻4天以内的文件
find /usr -mtime +4 查找文件更新日时在距现在时刻5天以上的文件
find /usr -mtime 4 查找文件更新日时在距现在时刻4天以上5天以内的文件
通过wc -l统计行数可以看出内容修改过的文件数符合正常的文件修改的规律。
- 按照文件所有者和群组来查找:
find / -user mhy
注意:find / -nouser -a -nogroup 可以找出系统中不属于任何人和任何群组的文件,对于这些文件我们需要保持警惕。
这里我们可以引申 -a -o -not的用法:
-o 是或者的意思
-a 是而且的意思
-not 是相反的意思
通过这三个我们可以*组合各种筛选选项或者规则。比如:列出/var目录下属于某个用户的文件并且文件名包含a的文件。
- 按照文件类型来查找文件:
find / -type p
列出所有的管道类型文件
- 按照文件大小来查找文件:
find / -size +10M
列出/usr中大于10M的文件
- 按照文件权限来查找文件:
find /var -perm 777
列出/var目录下文件权限为777的文件
引申内容:
find查找后执行的命令
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
注意一点:{}中的内容并非一次引用所有的搜索出的内容,而是一行一行引用。我也是在-exec tar -zcvf some.tar.gz {} \;时发现的。
举两个例子:
查找一下/var/log目录下内容更改时间为40天前并且大于100K的文件,并列出他们的路径。
find /var/log -mtime +40 -a -size +100k -exec ls -lh {} \;
查找一下/var/log目录下内容更改时间为30天前并且不属于root群组的文件,并提示是否删除他们。
find /var/log -type f -a -mtime +30 -not -group root -ok rm -rf {} \;
好了,今天就写到这里了,本人不才,如有错误请读者指出,十分感谢!