find 命令

1. find

find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件。

find的使用格式如下:

$ find <指定目录> <指定条件> <指定动作>

  - <指定目录>: 所要搜索的目录及其所有子目录。默认为当前目录。

  - <指定条件>: 所要搜索的文件的特征。

  - <指定动作>: 对搜索结果进行特定的处理。

如果什么参数也不加,find默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。

find的使用实例:

$ find . -name 'my*'

搜索当前目录(含子目录,以下同)中,所有文件名以my开头的文件。
$ find . -name 'my*' -ls

搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。
$ find . -type f -mmin -10

搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录。

2. which

which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

which命令的使用实例:

$ which grep

复制代码
find ./ -name “*.txt” | xargs rm    (删除当前目录下所有以txt结尾的文件)    
find   /home   -size   +512k                查大于512k的文件
find   /home   -size   -512k               查小于512k的文件
find   /home   -links   +2                查硬连接数大于2的文件或目录
find   /home   -perm   0700                查权限为700的文件或目录
find    /   -amin    -10     # 查找在系统中最后10分钟访问的文件
find    /   -atime   -2        # 查找在系统中最后48小时访问的文件
find    /   -empty             # 查找在系统中为空的文件或者文件夹
find    /   -group   cat        # 查找在系统中属于 groupcat的文件
find    /   -mmin   -5         # 查找在系统中最后5分钟里修改过的文件
find    /   -mtime   -1       #查找在系统中最后24小时里修改过的文件
find    /   -nouser           #查找在系统中属于作废用户的文件
find    /   -user    fred     #查找在系统中属于FRED这个用户的文件
复制代码

3. 有如下结构的示例目录 directory

复制代码
$ tree directory
directory
├── file1
├── file2
├── sub-dir1
│   ├── file1
│   ├── file2
│   └── file3
└── sub-dir2
    ├── file2
    └── sub-subdir1
        └── file1

3 directories, 7 files
复制代码
  1. 默认的 find 命令会列出该目录下的所有文件
复制代码
$ find directory
directory
directory/sub-dir1
directory/sub-dir1/file3
directory/sub-dir1/file2
directory/sub-dir1/file1
directory/file2
directory/sub-dir2
directory/sub-dir2/file2
directory/sub-dir2/sub-subdir1
directory/sub-dir2/sub-subdir1/file1
directory/file1
复制代码
  1. 为 find 命令指定 expression 以筛选出特定的文件
$ find directory -name file2
directory/sub-dir1/file2
directory/file2
directory/sub-dir2/file2
  1. 为 find 命令指定特殊的 action(此处 -delete 表示删除搜索结果)
复制代码
$ find directory -name file2 -delete
$ find directory
directory
directory/sub-dir1
directory/sub-dir1/file3
directory/sub-dir1/file1
directory/sub-dir2
directory/sub-dir2/sub-subdir1
directory/sub-dir2/sub-subdir1/file1
directory/file1
复制代码

二、搜索条件(expression)

1. 根据文件名检索

find 命令中的 -name 选项可以根据文件名称进行检索(区分大小写)。如需要忽略文件名中的大小写,可以使用 -iname 选项。

-name-iname 两个选项都支持 wildcards 。如:

  • ? 可以表示任意一个单一的符号
  • * 可以表示任意数量(包括 0)的未知符号

 find /usr -name '*.txt'  查找 /usr 目录下所有文件名以 .txt 结尾的文件
  find /usr -name '????'  查找 /usr 目录下所有文件名刚好为 4 个字符的文件

有些时候,你需要在搜索时匹配某个文件或目录的完整路径,而不仅仅是匹配文件名。可以使用 -path-ipath 选项。

如查找 /usr 下所有文件名以 .txt 结尾的文件或目录,且该文件的父目录必须是 src。可以使用以下命令:

find /usr -path '*/src/*.txt'

2. 根据文件类型检索

如果只想搜索得到文件或目录,即不想它们同时出现在结果中。可以使用 -type 选项指定文件类型。

-type 选项最常用的参数如下:

  • f: 文件
  • d: 目录
  • l: 符号链接

 find /usr -type d -name 'python*'   检索 /usr 下所有文件名以 python 开头的目录

3. 检索空文件

find 命令支持 -empty 选项用来检索为空的文件或目录。空文件即文件里没有任何内容,空目录即目录中没有任何文件或子目录。

 find ~ -type d -empty  检索用户主目录下所有的空目录

4. 反义匹配

find 命令也允许用户对当前的匹配条件进行“反义”(类似于逻辑非操作)。

如需要检索 /usr 下所有文件名.txt 为后缀的文件。可以使用以下命令:

find /usr -type f ! -name '*.txt'

也可以“翻转”任何其他的筛选条件,如:
  find /usr -type f ! -empty  检索 /usr 下所有内容不为空的文件

5. 根据文件的所属权检索

为了检索归属于特定用户的文件或目录,可以使用 -user 选项。

 find / -type f -user starky   检索根目录下所有属主为 starky 的文件

类似于 -user选项,-group 选项则可以根据文件或目录的属组进行检索。

7. 根据文件大小检索

-size 选项允许用户通过文件大小进行搜索(只适用于文件,目录没有大小……)。

表示文件大小的单位由以下字符组成:

  • c:字节
  • k:Kb
  • M:Mb
  • G:Gb

另外,还可以使用 +- 符号表示大于小于当前条件。

 find / -size +1G  检索文件大小高于 1 GB 的文件

三、对搜索结果执行命令

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.gz <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 选项。

 find / -type file -size +1G -ls   浏览所有 1G 以上大小的文件的详细信息

四、常用参数汇总

参数解析
-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 指定文件的属主
posted @   Bonnie_ξ  阅读(165)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示