Infinite Games

Less is More.

Linux 命令:Find

find – walk a file hierarchy 提供遍历文件系统的功能,用于查找想要的文件。

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

Options

-L

跟随 symbolic links。

-P

不跟随 symbolic links。

-H

不跟随 symbolic links 除非处理命令行参数。

-name

指定需要匹配的文件规则。

-path

指定某种路径规则,例如 find root_path -path '**/lib/**/*.ext'

-type

指定查找的文件类型:

  • f 常规文件
  • d 目录
  • l 符号链接(symbolic link)
  • s socket
  • p 命名管道(named pipe)
  • b 特殊的块设备(block (buffered) special)
  • c 特殊的字符设备(character (unbuffered) special)

例如 find . -type f 查找当前目录下的所有常规文件。

-mindepth levels

最小的遍历层级,例如当前目录下有 A/B/C 目录层级,find . -mindepth 2 不会输出目录 A,因为 A 的目录层级是 1,只会从 B 开始输出。这个参数的默认值就是 1。

-maxdepth levels

-mindepth 类似,指定遍历的最大层级。

-exec command

对每一个文件执行命令,会使用 {} 替代输出,例如执行 dirname 命令,获取每个包含 go.mod 文件的目录。

find . -mindepth 2 -type f -name 'go.mod' -exec dirname {} \;

find root_path -name '*.ext' -exec wc -l {} \;

-print

格式化参数,如果语法中的 [expression] 没有指定,默认会使用 -print

但是 -print 不会匹配空格、单双引号、换行符等字符,只会完全匹配。例如查找文件 core,如果 core 有空格就匹配不上,需要使用 -print0

Examples

查找指定后缀的文件

find root_path -name '*.ext'

查找匹配多种模式的文件

find root_path -name '*pattern_1*' -or -name '*pattern_2*'

查找目录使用不区分大小写(case-insensitive mode)的模式

find root_path -type d -iname '*lib*'

查找文件匹配某种路径规则

find root_path -path '**/lib/**/*.ext'

匹配某个目录下面的 lib 目录下面的以 ext 作为后缀的文件。

查找某个大小(size)范围的文件

find root_path -size +500k -size -10M

查询文件匹配某个模式,且不再某个模式的路径下

find root_path -name '*.py' -not -path '*/site-packages/*'

查找包含 go.mod 文件的目录

find . -mindepth 2 -type f -name 'go.mod' -exec dirname {} \;

查找并删除目录下的指定文件

删除 tmp 目录下所有命名为 core 的文件。

find /tmp -name core -type f -print0 | xargs /bin/rm -f

查找过去 7 天修改过的文件并删除

find root_path -mtime -7 -delete

References