Linux 命令之 find -- 查找文件和目录/搜索文件和目录

文章目录

命令介绍

find 命令可以根据给定的目录和表达式查找文件或目录。find 参数选项很多,并且支持正则,功能强大。和管道结合使用可以实现复杂的功能,是系统管理者和普通用户必须掌握的命令。

find 如不加任何选项,表示查找当前目录下的所有文件和目录,如果服务器负载比较高尽量不要在高峰期使用 find 命令,find 命令模糊搜索还是比较消耗系统资源的。

语法格式

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<群组名称>查找符合指定之群组名称的文件或目录
-ilname<范本样式>此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别
-iname<范本样式>此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别
-inum<inode编号>查找符合指定的inode编号的文件或目录
-ipath<范本样式>此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别
-iregex<范本样式>此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别
-links<连接数目>查找符合指定的硬连接数目的文件或目录
-iname<范本样式>指定字符串作为寻找符号连接的范本样式
-ls假设find指令的回传值为true,就将文件或目录名称列出到标准输出
-maxdepth<目录层级>设置最大目录层级
-mindepth<目录层级>设置最小目录层级
-mmin<分钟>查找在指定时间曾被更改过的文件或目录,单位以分钟计算
-mount此参数的效果和指定“-xdev”相同
-mtime<24小时数>查找在指定时间曾被更改过的文件或目录,单位以24小时计算
-name<范本样式>指定字符串作为寻找文件或目录的范本样式
-newer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录
-nogroup找出不属于本地主机群组识别码的文件或目录
-noleaf不去考虑目录至少需拥有两个硬连接存在
-nouser找出不属于本地主机用户识别码的文件或目录
-ok<执行指令>此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令
-path<范本样式>指定字符串作为寻找目录的范本样式
-perm<权限数值>查找符合指定的权限数值的文件或目录
-print假设find指令的回传值为true,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串
-print0假设find指令的回传值为true,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行
-printf<输出格式>假设find指令的回传值为true,就将文件或目录名称列出到标准输出。格式可以自行指定
-prune不寻找字符串作为寻找文件或目录的范本样式
-regex<范本样式>指定字符串作为寻找文件或目录的范本样式
-size<文件大小>查找符合指定的文件大小的文件
-true将find指令的回传值皆设为true
-type<文件类型>只寻找符合指定的文件类型的文件
-uid<用户识别码>查找符合指定的用户识别码的文件或目录
-used<日数>查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算
-user<拥有者名称>查找符和指定的拥有者名称的文件或目录
-xdev将范围局限在先行的文件系统中
-xtype<文件类型>此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查
-help--help在线帮助,在MacOS中无法使用任何选项查看find命令的使用帮助,只能使用man命令查看在线帮助文档
-version--version显示版本信息

文件类型

类型标识说明
f普通文件
l符号连接
d目录
c字符设备
b块设备
s套接字
pFifo

参考示例

(一)在当前目录及其子目录下搜索内容中含有“140.206.111.111”的所有文件

[root@htlwk0001host qpw]# find . -type f -name "*" | xargs grep "140.206.111.111" # 在这里-name是多余的

(二)列出当前目录及其子目录下所有文件和目录

[root@htlwk0001host qpw]# find .

(三)在指定目录下查找特定名称的文件和目录

/home 目录及其子目录下查找以 .txt 结尾的文件(包含目录):

[root@htlwk0001host qpw]# find /home -name "*.txt" # 单引号、双引号,甚至不加引号都可以

在根目录及其子目录下查找以 .vim 开头的文件和目录:

[root@htlwk0001host test]# find / -name '.vim*'
/root/.vim
/root/.viminfo

(四)基于目录深度搜索

  1. 在当前目录及其子目录下,向下最大深度限制为 3,搜索所有的文件:
[root@htlwk0001host qpw]# find . -maxdepth 3 -type f
  1. 在当前目录及其子目录下,向下最大深度限制为 5,搜索所有以“.txt”为后缀的文件:
[root@htlwk0001host home]# find . -maxdepth 5 -name *.txt
./wwwroot/liaowenxiong/fjrd/pc_website/目录结构说明.txt
./wwwroot/liaowenxiong/fjrd/m_website/MP_verify_Cdd7AZHGEGeEyDyY.txt

(五)将指定目录下的指定文件删除

删除当前目录及其子目录下的所有以“.txt”为后缀的文件:

[root@htlwk0001host qpw]# find . -type f -name "*.txt" -delete

(六)将指定目录下的空目录全部删除

将目录 /dir 及其子目录下的空目录全部删除:

[root@htlwk0001host qpw]# find /dir -type d -empty -delete

解释:

  1. 在目录 /dir 及其子目录下搜索(即递归搜索目录 /dir
  2. -type d 文件类型是目录(即仅搜索目录)
  3. -empty 空目录(即仅搜索空目录)
  4. -delete 执行删除操作(即将搜索到的空目录删除掉)

(七)删除指定名称的目录

删除当前目录及其子目录下的名为 MyDocuments 的目录:

[root@localhost test]# find . -type d -name "MyDocuments" -exec rm -rf {} +

(八)将属于某个用户的文件的所有权全部转移到其它用户名下

借助 -exec 选项与其他命令结合使用,在当前目录及其子目录下找出用户 root 所有的文件,并把文件的所有者更改为用户 tom:

[root@htlwk0001host qpw]# find . -type f -user root -exec chown tom {} \;

上例中, {} 用于与 -exec 选项结合使用来匹配所有文件,然后会被替换为相应的文件名。

(九)查找指定的文件并全部复制到另一个目录下

在指定目录下查找所有以“.txt”结尾的文件并复制到另一个目录下:

find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 

(十)查找指定的文件并全部打成一个包

查找所有以“.log”结尾的文件并做成一个 bzip 包:

find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 

(十一)在指定目录下搜索隐藏的文件

在当前目录下及其子目录下查找隐藏文件:

[root@htlwk0001host /]# find . -name '.*'
[root@htlwk0001host /]# find . -iname '.*' # -i 表示忽略大小写

(十二)在指定目录下查找指定名称的文件和目录,并将结果保存到指定的文件中

在目录 /home/www 下查找所有的隐藏文件和目录,并将结果写入到文件 foo.txt:

[root@dabu.info ~]#find /home/www/ -name ".*" > foo.txt

接着你可以使用命令 cat 或者 less 来查看文件的内容。

(十三)在指定目录下同时查找多种格式的文件

当前目录及子目录下查找所有以 .txt 和 .pdf 结尾的文件:

[root@htlwk0001host /]# find . \( -name "*.txt" -o -name "*.pdf" \)
./etc/pki/nssdb/pkcs11.txt
./root/log.txt

[root@htlwk0001host /]# find . -name "*.txt" -o -name "*.pdf"

(十四)在指定目录下查找特定路径的文件和目录

在目录 /usr 及其子目录下查找路径中含有关键词“local”的目录和文件:

[root@htlwk0001host /]# find /usr/ -path "*local*"
/usr/bin/locale

(十五)基于正则表达式匹配文件路径,查找特定的文件

使用正则表达式查找以“.txt”或者“.pdf”作为扩展名的文件:

[root@htlwk0001host /]# find . -regex ".*\(\.txt\|\.pdf\)$"
./etc/pki/nssdb/pkcs11.txt
[root@htlwk0001host /]# find . -iregex ".*\(\.txt\|\.pdf\)$" # -i 忽略大小写
./etc/pki/nssdb/pkcs11.txt

(十六)对查找的结果取反

目录 /home 及其子目录下找出不是以 “.txt” 结尾的文件:

[root@htlwk0001host /]# find /home ! -name "*.txt"
/home
/home/wwwroot
/home/wwwroot/liaowenxiong

(十七)搜索出深度距离当前目录至少 2 个子目录的所有文件

[root@htlwk0001host /]# find . -mindepth 2 -type f
./dev/shm/aliyun-assist-agent-coldstarted
./proc/fb
./proc/fs/xfs/xqm
./proc/fs/xfs/xqmstat

(十八)根据文件时间戳进行查找

UNIX/Linux 文件系统每个文件都有三种时间戳:

  1. 访问时间 (-atime/天,-amin/分钟):用户最近一次访问时间
  2. 修改时间 (-mtime/天,-mmin/分钟):文件最后一次修改时间
  3. 变化时间 (-ctime/天,-cmin/分钟):文件数据元(例如:权限)最后一次修改时间

1.查找最近七天内被访问过的所有文件

[root@htlwk0001host /]# find . -type f -atime -7
./dev/shm/aliyun-assist-agent-coldstarted
./proc/fs/xfs/xqm

2.查找恰好在第七天前被访问过的所有文件

这里要注意,是当前时间往前第 7 天被访问的文件,而不是 7 天前的意思,7 天前是指当前时间往前第 8 天,第 9 天,第 10 天…

[root@htlwk0001host /]# find . -type f -atime 7

3.查找超过七天内被访问过的所有文件

搜索访问时间超过 7 天的所有文件:

[root@htlwk0001host /]# find . -type f -atime +7

4.查找访问时间超过 10 分钟的所有文件

[root@htlwk0001host /]# find . -type f -amin +10

5.查找比 file.log 修改时间更长的所有文件

[root@htlwk0001host /]# find . -type f -newer file.log

(十九)根据文件大小进行查找

文件大小单元:

  1. b:块(512字节)
  2. c:字节
  3. w:字(2字节)
  4. k:千字节
  5. M:兆字节
  6. G:吉字节

1.查找大于 10KB 的文件

[root@htlwk0001host /]# find . -type f -size +10k # 大于 10kb,不含 10kb

2.查找小于 10kb 的文件

[root@htlwk0001host /]# find . -type f -size -10k

3.查找等于 10kb 的文件

[root@htlwk0001host /]# find . -type f -size 10k

(二十)在当前目录下查找权限为 777 的文件

[root@htlwk0001host ~]# find . -type f -perm 777

(二十一)在当前目录下查找权限不是 644 的 php 文件

[root@htlwk0001host ~]# find . -type f -name "*.php" ! -perm 644

(二十二)在当前目录下查找用户 tom 拥有的所有文件

[root@htlwk0001host ~]# find . -type f -user tom

(二十三)在当前目录下查找用户组 sunk 拥有的所有文件

[root@htlwk0001host ~]# find . -type f -group sunk

(二十四)找出自己家目录下所有的 .txt 文件并删除

[root@htlwk0001host ~]# find $HOME/. -name "*.txt" -ok rm {} \;

-ok-exec 行为一样,不过它会给出提示,是否执行相应的操作。

(二十五)当前目录下查找所有 .txt 文件并把他们拼接起来写入到 all.txt 文件中

[root@htlwk0001host ~]# find . -type f -name "*.txt" -exec cat {} \; > all.txt

(二十六)将 30 天前的 .log 文件移动到 old 目录中

[root@htlwk0001host ~]# find . -type f -mtime +30 -name "*.log" -exec cp {} old \;

(二十七)当前目录或者子目录下查找所有 .txt文件,但是跳过子目录 sk

[root@htlwk0001host ~]# find . -path "./sk" -prune -o -name "*.txt" -print

(二十八)在家目录下查找最近7天内修改过的,且以 jpeg 或者 jpg 为扩展名的文件

[root@htlwk0001host ~]# find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7

(二十九)你的磁盘空间不够用,你想在 log 目录下找到所有巨大的(让我们定义为“大于 1GB”)文件

[root@htlwk0001host ~]# find /var/log -size +1G

(三十)在 /data 中查找 bcotton 拥有的所有文件

find /data -owner bcotton

(三十一)在你的主目录中查找其他人可读的文件

find ~ -perm -o=r

(三十二)删除 MacOS 下自动生成的文件

find ./ -name '__MACOSX' -depth -exec rm -rf { } \;

(三十三)统计源代码的行数

find . -name "*.java"|xargs cat|grep -v ^$|wc -l # 代码行数统计, 排除空行

(三十四)命令 find 结合选项 -exec 的使用实例

请猛戳《Linux 中常见的较为复杂的 find 命令实例

    原文作者:liaowenxiong
    原文地址: https://blog.csdn.net/liaowenxiong/article/details/115511399
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞