Linux find命令
Linux上的find命令是findutil软件包的一部分, 一般已经默认集成在了几乎所有的发行版中
find命令有非常大的灵活性,可以向其指定丰富的搜索条件(如文件权限, 属主, 属组,文件类型,日期和大小等)来定位系统中的文件和目录
此外,find还支持对搜索到的结果进行多种类型的命令操作
一. find命令的基本结构如下:
find [paths] [expression] [actions]
find命令接受一个或多个路径(paths)作为搜索范围,并在该路径下递归的搜索,即搜索完指定的目录后,还会对该目录下的子目录进行检索,以及子目录下的子目录,直到达到目录树底部
默认情况如果不带任何搜索条件,find命令会返回指定目录下的所有文件,所以常常需要通过特定的expression对结果进行筛选
find命令默认的action是将所有检索结果打印至标准输出,可以自定义action,让find命令对搜索到的结果执行特定的操作
首先查看示例目录(Desktop)
默认find命令会列出改目录下的所有文件
为find命令指定expression以筛选出特定的文件
为find命令指定特殊的action(此处 -delete表示删除搜索结果)
二. 搜索条件(expression)
1. 根据文件检索
find命令中 -name选项可以根据文件名称进行检索(区分大小写), 如需要忽略文件名中的大小写, 可以使用 -iname选项
-name和-iname两个选项都支持wildcards, 如:
?可以表示任意一个单一的符号
*可以表示任意数量(包括0)的符号
find /usr -name '*.txt'
find /usr -name ???? (查找/usr目录下所有的文件名刚好为4个字符的文件)
有些时候,你需要在搜索时匹配某个文件或目录的完整路径,而不仅仅是匹配文件名,可以使用-path或者-ipath选项, 如下所示:
2. 根据文件类型检索
如果只想搜索得到文件或者目录,即不想它们同时出现在结果中,可以使用-type选项指定文件类型
-type选项最常用的参数如下:
f: 文件
d: 目录
l: 符号链接
3. 检索空文件
find命令支持 -empty选项用来检索为空的文件或目录。空文件即文件里没有任何内容,空目录即目录中没有任何文件或子目录
find / -type d -empty
4. 反义匹配
find命令也允许用户对当前的匹配条件进行"反义"(类似于逻辑非操作)
如需要检索 /usr下所有文件名不以.txt为后缀的文件,可以使用以下命令
find /usr -type f ! -name '*.txt'
也可以翻转任何其他的筛选条件, 如:
find /usr -type f ! -empty
5. 根据文件的所属权检索
为了检索归属于特定用户的文件或者目录,可以使用-user选项
find / -type f -user root
-group选项则可以根据文件或目录属组进行检索
6. 根据时间日期进行检索
根据文件创建或者修改的时间进行检索
Linux系统中,与文件相关联的时间参数有以下三种:
修改时间: 最后一次文件内容有过更改的时间点
访问时间: 最后一次文件有被读取过的时间点
变更时间: 最后一次文件有被变更过的时间点(如内容被修改,或权限等被修改)
对应的是find命令中的-mtime, -atime, -ctime(cmin等)
该三个选项的使用准寻以下示例中的规则
-mtime 3: 该文件3天前被修改过
-mtime -3: 该文件3天以内被修改过
-mtime +3: 该文件距离上次修改已经超过3天时间
find /usr -type f -mtime 3 检索/usr下两天前被修改过的文件
如果觉得-mtime等选项以天为单位时间有点长,还可以使用-mmin, -amin, -cmin三个选项:
find /usr -type f -mtime +50 -mtime -100 检索/usr下50到100天之前被修改过的文件
find /usr -type f -mtime 2 检索/usr下两天前被修改且5分钟前又读取过的文件
7. 根据文件大小检索
-size 选项允许用户通过文件大小进行检索(只适用于文件,目录没有大小...)
表示文件大小的单位由以下字符组成
c: 字节
k: Kb
M: Mb
G: Gb
另外,还可以使用+或者-符号表示大于或者小于当前条件
find / -size +1G 检索文件高于1GB的文件
8. 根据文件权限检索
find命令可以使用 -perm选项以文件权限为依据进行搜索
使用符号形式
如需要检索/usr/目录下权限为rwxr-xr-x的文件, 可以使用以下命令
find /usr -perm u=rwx, g=rx, o=rx
搜索/usr目录下所有权限为r-xr-xr-x(即系统中的所有用户都只有读写权限)的文件和目录,可以使用如下命令
find /usr -perm a=rx
很多时候,我们只想匹配文件权限的子集.比如,检索可以直接被任何用户执行的文件,即只关心文件的执行权限,而不用管其读写权限是什么
其中的a=x前面的/符号即用来表示只匹配权限的某个子集(执行权限), 而不用其他权限的具体设置
使用数字形式
-perm选项也支持数字形式的文件权限标记
find /usr -perm 644搜索 /usr 目录下权限644(即rwxr-xr-x)的文件
9. 限制遍历的层数
find命令默认是以递归的方式检索项目的,这有时候会导致得到的结果数量非常巨大。可以使用-maxdepth限制find命令递归的层数
find / -maxdepth 3 搜索时向下递归的层数最大为3
10. 逻辑组合
在之前的例子中出现多个搜索条件的组合以及对某个搜索条件的反转
实际上find命令支持 and 和 or两种逻辑运算,对应的命令选项分别是-a和-o, 通过这两个选项可以对搜索条件进行更复杂的组合
此外还可以使用小括号对搜索条件进行分组,注意find命令中的小括号常需要用单引号包裹起来。因小括号在shell中有特殊的含义
如检索/usr 下文件名以python开头且类型为目录的文件
find /usr -type d -name 'python*'
该命令等同于:
find /usr -type d -a -name 'python*'
更复杂的组合形式如:
find / '(' -mmin -5 -o -mtime +50 ')' -a -type f
三. 对搜索结果执行命令
1. 删除文件
-delete选项可以用来删除搜索到的文件和目录
如删除home目录下所有的空目录
find ` -type d -empty -delete
2. 执行自定义命令
-exec选项可以对搜索到的结果执行特定的命令
如需要将home目录下所有的mp3音频文件复制到移动存储设备(假设路径是/media/Mydrive), 可以使下面的命令
find / -type f -name '*.mp3' -exec cp {} /media/Mydrive ';'
其中的大括号{}作为检索到的文件的占位符,而分号;作为命令结束的标志。因为分号是shell中有特殊含义的符号,所以需要使用单引号括起来
每当find命令检索到一个符合条件的文件,会使用其完整路径取代命令中的{}, 然后执行-exec 后面的命令一次
另一个很重要的用法是,在多个文件中检索某个指定的字符串
如在用户主目录下的所有文件中检索字符串hello, 可以使用如下命令
find / -type f -exec grep -l hello {} ';'
-exec 选项中的+符号
创建Gzip格式的压缩文件的命令为: tar -czvf filename.tar <list of files>
现在假设需要将用户主目录下所有的MP3文件添加到压缩包music.tar.gz中, 直观的感觉是:
find / -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} ';'
实际情况是,这样得到的music.tar.gz其中只包含一个MP3文件
原因是find命令每次发现一个音频文件,都会在执行一次-exec选项后面的压缩命令。导致先前生成的压缩包被覆盖
可以先让find命令检索出所有符合条件的音频文件,在将得到的文件列表传递给后面的压缩命令。完整的命令如下:
find / -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} +
显示文件信息
如果想浏览到的文件(目录)的详细信息(如权限和大小等), 可以直接使用 -ls选项
四. 常用参数汇总
-atime n[smhdw] 距离文件上次被访问时的时间间隔
-ctime n[smhdw] 距离文件创建时的时间间隔
-delete 删除检索到的文件
-depth n 检索深度为 n 的文件,即位于指定目录以下 n 层的文件
-empty 检索空文件或空目录
-fstype type 指定文件所在的文件系统的类型
-group gname 指定文件的属组
-iname pattern 同 -name,忽略大小写
-ipath pattern 同 -path,忽略大小写
-ls 打印搜索到的文件的详细信息
-maxdepth n 指定递归的最大层数为 n
-mtime n[smhdw] 距离文件上次发生变更时的时间间隔
-name pattern 搜索时使用 pattern 对文件名进行匹配
-path pattern 搜索时使用 pattern 对文件路径进行匹配
-perm mode 根据文件权限搜索
-size n[ckMGTP] 根据文件大小搜索
-type t 根据文件类型搜索
-user uname 指定文件的属主