TOC

Linux: find 命令

目录

  • -path
  • -prune 不进入指定目录
find . -path ./.git -prune -o -print
find . -path ./.git -prune -o -path ./build -prune

目录深度

如果使用这几个参数,那么这个参数应该放到最前面

  • -depth
  • -maxdepth 最大迭代深度
  • -mindepth 最小迭代深度

文件名

  • -name
  • -iname

正则

  • -regex
  • -iregex
find ./apps/api/ -maxdepth 3 -regextype "posix-egrep" -regex ".*/(vpc.py|server.py)"

空目录/空文件

# 空目录
find . -type d -empty
find . -type d -empty -exec rmdir {} \;

# 空文件
find . -type f -empty

类型

选项:b, c, d (目录), p, f (文件), l (链接), s (Socket), D

用的多的还是目录和文件查找:

  • -type d
  • -type f

大小过滤

可用单位:b (块,512B,默认), c (Byte), w (字,2B), k , M, G

大于/小于 10M 的文件:

find . -maxdepth 1 -type f -size +10M
find . -maxdepth 1 -type f -size -10M

# 列出小于三兆的 mp3 文件
find ~/Music -name '*.mp3' -size -3M -ls

权限过滤

# 精准匹配
find . -type f -perm 755 -iname "*.md" -exec chmod 644 {} \;
# 与:u g o 都有执行权限,最低权限判断
find . -type f -perm -111 -iname "*.md" -exec chmod 644 {} \;
# 或:u+x | g+x | o+x 满足一个条件即可
find . -type f -perm /111 -iname "*.md" -exec chmod 644 {} \;

# 这几个参数可以注意一下:
# -writable
# -readable
# -executable

时间过滤

创建和访问时间:

  • -amin 访问时间(分钟)
  • -atime 访问时间(天)
  • -cmin 创建时间(分钟)
  • -ctime 创建时间(天)
  • -mmin 修改时间(分钟)
  • -mtime 修改时间(天)

值得注意的是,上面按天为单位的那些时间过滤参数是按整除来算的,比如:find $HOME -mtime 0,表示一天以内,应为修改时间整除 24 小时为 0 的就是 24 小时以内。

还有一个参数 used,好像是文件状态变更之后的访问时间。

Linux 文件的三种时间

  • atime 访问时间 Access
  • ctime 修改时间 Change, 文件状态变化
  • mtime 修改时间 Modify, 文件内容变化

Linux 并没有创建时间,这是令人费解的,可能是早期文件系统没有这个信息吧。

PS: stat -c %w requirements.txt

PS: sudo debugfs -R 'stat 相对分区的文件路径/<inode_number>' /dev/sda1 | cat 中有一个 crtime 字段

执行命令

  • -print 默认行为,打印文件名

使用 ls 参数

-lsls 命令一样,列出详细信息

find . -name '*.py' -ls

find $HOME -maxdepth 1 -type d -ls

# ls 输出非 ASCII 字符会转义,对中文环境不友好
find $HOME -maxdepth 1 -exec ls -ldh {} + | column -t

使用 delete 参数

find . -maxdepth 1 -type f -name '*~' -delete
find . -maxdepth 1 -type f -name '*.pyc' -delete

使用 exec 参数

find . -type f -exec chmod 644 {} \;
find . -name "*.php" -exec mv {} ~/codes/php \;

find . -type d -name "__pycache__" -exec rm -rf \;
find . -type d -name "__pycache__" -exec rm -rf {} +
find . -type d -name "__pycache__" -depth +4 -print0 -exec rm -rf {} +

联合 xargs 命令:

find . -type d -empty -print0 | xargs -0 -I {} /bin/rm -rf "{}"
find /var/cache/TheSunProject/ -type d -name "backup_*" -print0 | xargs -0 -I {} /bin/rm -rf "{}"
find . -type d -mtime +30 -print0 | xargs -I dir -0 /bin/rm -rvf "dir" > /tmp/delete.log

复杂逻辑

参考手册中 OPERATORS 一节:

  • ( expr ) 在 shell 中括号需要转义
  • expr1 expr2
  • expr1 -a expr2
  • expr1 -and expr2
  • expr1 -or expr2
  • expr1 -o expr2
  • -not expr
  • ! expr
  • expr1 , expr2

排除

find . -path ./.git -prune -false -o -type f
find . -name .git -prune -false -o -used -7 -type f -print
find . -type d \( -name .git -o -name node_modules -o -name build \) -prune -false -o -print