Find 过滤搜索、目录层级限制(
#find [搜索范围] [匹配条件]
-------------------------------------------------
1. 根据文件名称进行
find
检索
find
命令中的 -name 选项可以根据文件名称进行检索(区分大小写)。如需要忽略文件名中的大小写,可以使用 -iname 选项。
-name 区分大小写
-iname 不分区大小写
? 可以表示任意一个单一的符号
* 可以表示任意数量(包括 0)的未知符号
#find /usr -name '*.txt' #查找/usr目录下所有文件名以.txt结尾的文件
#find /usr -name '????' #查找/usr目录下所有文件名刚好为4个字符的文件
#find /etc -name init
#find /etc -name *init*
#find /etc -name init???
#touch /tmp/inIt
#mkdir /tmp/Init
#find /tmp -name init
#find /tmp -iname init #不区分大小写
#find /tmp -iname ini*
有些时候,需要在搜索时匹配某个文件或目录的完整路径,而不仅仅是匹配文件名。可以使用 -path 或 -ipath 选项。
如查找
/usr
下所有文件名以.txt结尾的文件或目录,且该文件的父目录必须是src。可以使用以下命令:
#find /usr -path '*/src/*.txt'
-------------------------------------------------
2. 根据文件类型进行
find
检索
如果只想搜索得到文件或目录,即不想它们同时出现在结果中。可以使用 -
type
选项指定文件类型。
-
type
选项最常用的参数如下:
f: 文件
d: 目录
l: 符号链接
# find /usr -type d -name 'python*' #检索/usr下所有文件名以python开头的目录
#find /etc -name init* -type f
#find /etc -name init* -a -type d
-a 两个条件同时满足
-o 两个条件满足一个即可
-------------------------------------------------
3. 根据文件大小进行
find
检索
-size 选项允许用户通过文件大小进行搜索(只适用于文件,目录没有大小)。
表示文件大小的单位由以下字符组成:
c:字节
k:Kb
M:Mb
G:Gb
另外,还可以使用 + 或 - 符号表示大于或小于当前条件。
#find / -size +204800 #查找大于100M的文件
#find / -size -204800 #查找小于100M的文件
#find / -size 204800 #查找等于100M的文件
#find / -size +1G #检索文件大小高于1GB的文件
#find / -size -10M #检索文件大小小于10M的文件
204800单位是数据块
1数据块=512字节=0.5K
100MB = 102400KB
100MB = 2048数据块
#find /etc -size +163840 -a -size -204800 #查找大于80M小于100M的文件
# find / -size 50M
# find / -size +50M -size -100M
# find / -size +100M -exec rm -rf {} ;
# find / -type f -name *.mp3 -size +10M -exec rm {} ;
-------------------------------------------------
4. 检索空文件
find
命令支持 -empty 选项用来检索为空的文件或目录。空文件即文件里没有任何内容,空目录即目录中没有任何文件或子目录。
# find ~ -type d -empty #检索用户主目录下所有的空目录
-------------------------------------------------
5. 反义匹配
find
命令也允许用户对当前的匹配条件进行
"反义"
(类似于逻辑非操作)。
如需要检索
/usr
下所有文件名不以 .txt 为后缀的文件。可以使用以下命令:
#find /usr -type f ! -name '*.txt'
也可以
"翻转"
任何其他的筛选条件,如:
#find /usr -type f ! -empty 检索 /usr 下所有内容不为空的文件
-------------------------------------------------
6. 根据文件的所属权进行
find
检索
#find / -type f -user starky #检索根目录下所有属主为starky的文件
#find / -user root 在根目录下查找所有者为root的文件
#find / -group root 在根目录下查找所属组为root的文件
# find / -user root -name tecmint.txt
# find /home -user tecmint
# find /home -group developer
# find /home -user tecmint -iname "*.txt"
-------------------------------------------------
7. 根据时间日期进行
find
检索
修改时间(Modification
time
):最后一次文件内容有过更改的时间点
访问时间(Access
time
):最后一次文件有被读取过的时间点
变更时间(Change
time
):最后一次文件有被变更过的时间点(如内容被修改,或权限等 metadata 被修改)
与此对应的是
find
命令中的 -mtime,-atime 和 -ctime 三个选项。
这三个选项的使用遵循以下示例中的规则:
-mtime 2: 该文件 2 天前被修改过
-mtime -2:该文件 2 天以内被修改过
-mtime +2:该文件距离上次修改已经超过 2 天时间
#find /usr -type f -mtime 2 #检索/usr下两天前被修改过的文件
如果觉得 -mtime 等选项以天为单位时间有点长,还可以使用 -mmin,-amin,-cmin 三个选项:
#find /usr -type f -mtime +50 -mtime -100 #检索/usr下50到100天之前修改过的文件
#find /usr -type f -mtime 2 -amin 5 #检索/usr下两天前被修改过且5分钟前又读取过的文件
#find /etc -amin 5 #查找5分钟之前被访问过的文件和目录
#find /etc -amin -5 #查找5分钟之内被访问过的文件和目录
#find /etc -amin +5 #查找距离上次被访问时间超过5分钟过的文件和目录
#find /etc -cmin 5 #查找5分钟之前被修改过属性的文件和目录
#find /etc -cmin -5 #查找5分钟之内被修改过属性的文件和目录
#find /etc -cmin +5 #查找距离上次被修改过属性超过5分钟的文件和目录
#find /etc -mmin 5 #查找5分钟之前被修改过内容的文件和目录
#find /etc -mmin -5 #查找5分钟之内被修改过内容的文件和目录
#find /etc -mmin +5 #查找距离上次被修改过内容超过5分钟的文件和目录
-------------------------------------------------
8. 根据文件权限进行
find
检索
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
很多时候,只想匹配文件权限的一个子集。比如,检索可以直接被任何用户执行的文件,即只关心文件的执行权限,而不用管其读写权限是什么。
上述的需求可以通过以下命令实现:
#find / -type f -perm /a=x
其中 a=x 前面的 / 符号即用来表示只匹配权限的某个子集(执行权限),而不用关心其他权限的具体设置。
使用数字形式
-perm 选项也支持数字形式的文件权限标记。
# find /usr -perm 644 #搜索/usr目录下权限为 644(即 rwxr-xr-x)的文件
# find . -type f -perm 0777 -print
# find / -type f ! -perm 777
# find / -perm 2644
# find / -perm 1551
# find / -perm /u=s
# find / -perm /g+s
# find / -perm /u=r
# find / -perm /a=x
# find / -type f -perm 0777 -print -exec chmod 644 {}\;
# find / -type d -perm 777 -print -exec chmod 755 {}\;
# find . -type f -name "tecmint.txt" -exec rm -f {} \;
# find . -type f -name "*.txt" -exec rm -f {} \;
# find . -type f -name "*.mp3" -exec rm -f {} \;
# find /tmp -type f -empty
# find /tmp -type d -empty
# find /tmp -type f -name ".*"
-------------------------------------------------
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
-------------------------------------------------
11. -
exec
command
{} \; 以及 -ok
command
{} \; 用法
#find /etc -name inittab -exec ls -l {} \; #查找inittab文件并显示其详细信息
在{}和\之间要有一个空格
-
exec
跟{}\; 之间执行的是对搜索结果进行的操作动作
#find /etc -name inittab -a -type f -exec ls -l {} \;
#touch /tmp/testfile.rm
#find /tmp -name testfile.* -exec rm {} \;
-ok等同于-
exec
-ok跟{}\; 之间执行的是对搜索结果进行的操作动作
和-
exec
不同的地方在于有一个询问,需要输入y或n确认
#find /etc -name init* -ok rm -l {} \;
-------------------------------------------------
12. 根据inode节点进行
find
检索
#find /etc -inum xxx #根据I节点查找
#touch "test 000"
#ls -i
#find . -inum 396401 -exec rm {} \;
#touch test999
#ln test999 test9999
#ls -i test999
#find . -inum 396401 -exec ls -l {} \;
-------------------------------------------------
13. 对搜索结果执行命令
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
选项中的 + 符号
现在假设需要将用户主目录下所有的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 {} +
3)显示文件信息
如果想浏览搜索到的文件(目录)的详细信息(如权限和大小等),可以直接使用-
ls
选项。
#find / -type file -size +1G -ls #浏览所有 1G 以上大小的文件的详细信息
赞 (0)