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
socketp
命名管道(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 {} \;
格式化参数,如果语法中的 [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