find 命令

255 阅读2分钟

find 是 Linux/Unix 系统中一个非常强大的命令行工具,用于在目录树中查找文件和目录,并对其执行操作。它支持根据多种条件(如文件名、类型、大小、权限、时间等)进行搜索,并且可以对找到的文件执行特定的操作(如删除、移动、复制等)。

基本语法

find [路径] [表达式] [操作]
  • 路径:指定查找的起始目录(如 / 表示根目录,. 表示当前目录)。
  • 表达式:定义查找的条件(如按文件名、类型、大小等)。
  • 操作:对找到的文件执行的操作(如删除、打印等)。

常用选项和表达式

1. 按文件名查找

  • -name "模式" :按文件名匹配(区分大小写)。
find /home -name "file.txt"
  • -iname "模式" :按文件名匹配(不区分大小写)。
find /home -iname "file.txt"

2. 按文件类型查找

-type:按文件类型查找。

  • f:普通文件。
  • d:目录。
  • l:符号链接。
find /var -type f

3. 按文件大小查找

-size:按文件大小查找。

  • +n:大于 n 个单位。
  • -n:小于 n 个单位。
  • n:等于 n 个单位。
  • 单位可以是 c(字节)、k(KB)、M(MB)、G(GB)。
find /var/log -size +10M

4. 按时间查找

  • -mtime:按文件修改时间查找。

    • +nn 天前修改。
    • -nn 天内修改。
find /tmp -mtime -7
  • -atime:按文件访问时间查找。
  • -ctime:按文件状态变更时间查找。

5. 按权限查找

  • -perm:按文件权限查找。

    find /home -perm 644
    

6. 按用户或组查找

  • -user:按文件所有者查找。

    find /home -user alice
    
  • -group:按文件所属组查找。

    find /home -group developers
    

常用操作

1. 打印文件路径(默认操作)

find /home -name "*.txt"

2. 删除文件

  • 使用 -delete
find /tmp -name "*.log" -delete
  • 使用 -exec
find /tmp -name "*.log" -exec rm -f {} \

3. 移动文件

find /home -name "*.bak" -exec mv {} /backup ;

4. 执行任意命令

  • 使用 -exec
find /var/log -name "*.log" -exec gzip {} ;
  • 使用 xargs
find /var/log -name "*.log" | xargs rm -f

高级用法

1. 组合条件

  • -a(AND) :同时满足多个条件(默认)。

    find /home -name "*.txt" -type f
    
  • -o(OR) :满足任意一个条件。

    find /home -name "*.txt" -o -name "*.log"
    
  • !(NOT) :排除条件。

    find /home ! -name "*.txt"
    

2. 限制查找深度

  • -maxdepth:限制查找的最大深度。

    find /home -maxdepth 2 -name "*.txt"
    
  • -mindepth:设置查找的最小深度。

    find /home -mindepth 2 -name "*.txt"
    

3. 处理空格或特殊字符

  • 使用 -print0 和 xargs -0

    find /home -name "*.txt" -print0 | xargs -0 rm -f
    

示例

  1. 查找当前目录下所有 .log 文件并删除:
find . -name "*.log" -delete
  1. 查找 /var/log 目录下大于 100MB 的文件并压缩:
find /var/log =size +100M -exec gzip {} \;
  1. 查找 /home 目录下 7 天内修改过的 .txt 文件:
find /home -mtime -7 -name "*.txt"