一、说明

find 命令是一个很常用的命令,用于在指定路径下查找文件,相似的命令还有 which、whereis、locate 等。

扩展:

1. which 命令只会查找环境变量中的文件位置,例如:

$ which find
/usr/bin/find    # find 命令所在路径

2. locate 命令是在 mlocate 数据库中搜索。

locate 与find 不同,find 是去硬盘找,locate 只在/var/lib/mlocate 资料库中找。locate 的速度比 find 快,因为它并不是真的查找,而是查数据库,一般文件数据库在 /var/lib/mlocate/mlocate.db 中,所以 locate 的查找并不是实时的,而是以数据库的更新为准,一般是系统自己维护,也可以手工升级数据库。

3. whereis 只能用于查找二进制文件、源代码文件和man手册页,例如

$ whereis -b bash        # 显示 bash 命令的二进制程序  
bash: /bin/bash /etc/bash.bashrc /usr/share/bash    # bash命令的二进制程序的地址  
$ whereis -m bash        # 显示 bash 命令的帮助文件  
bash: /usr/share/man/man1/bash.1.gz                # bash 命令的帮助文件地址  

 

二、语法

find [路径] -命令参数 [输出形式]

1. 路径

告诉 find 命令在什么路径下查找文件,可以设置多个,以空格隔开,不设置则默认为当前路径,路径参数必须在命令参数前。

2. 命令参数

告诉 find 命令根据什么样的条件查找文件,例如:-name、-perm、-user、-type 等等,后面再详细说明。

3. 输出形式

告诉 find 命令以什么样的形式输出查找结果,不设置则默认为 -print,即直接打印查找结果到屏幕。
其它输出形式还有 -print、-printf、-print0、-exec、-ok、-ls、-delete 等 ,具体后面说明。

 

三、参数详解

1. 命令参数

常用的命令参数有:

  • -name:按照文件名查找文件。
  • -perm:按照文件权限来查找文件。
  • -prune:使用这一选项可以使 find 命令不在当前指定的目录中查找,如果同时使用了 -depth 选项,那么 -prune 选项将无效。
  • -user:按照文件属主来查找文件。
  • -group:按照文件所属的组来查找文件。
  • -mtime -n +n:按照文件的更改时间来查找文件, -n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。
  • -mmin -n +n:按照文件的更改时间来查找文件, -n表示文件更改时间距现在n分钟以内,+n表示文件更改时间距现在n分钟以前。
  • -atime -n +n:按照文件的更改时间来查找文件,在过去n天内被读取过的文件,n 的正负解释如上。
  • -amin -n +n:按照文件的更改时间来查找文件,在过去n分钟内被读取过,n 的正负解释如上。
  • -ctime -n +n:按照文件的更改时间来查找文件,在过去n天内被修改过的文件,n 的正负解释如上。
  • -cmin -n +n:按照文件的更改时间来查找文件,在过去 n 分钟内被修改过,n 的正负解释如上。
  • -nogroup:查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
  • -nouser:查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
  • -newer file1 ! file2:查找更改时间比文件file1新但比文件file2旧的文件。
  • -type:查找某一类型的文件,诸如:

    b:块设备文件。
    d:目录。
    c:字符设备文件。
    p:管道文件。
    l:符号链接文件。
    f:普通文件。
    s:socket文件

  • -size n[cwbkMG]:文件大小为 n,单位为后缀决定的数据块。其中后缀为:

    b:代表 512 位元组的区块(默认单位为 b)
    c:表示字节数
    k:表示KB (1024字节)
    w:字 (2字节)
    M:兆字节(1024KB)
    G:千兆字节 (1024MB)

  • -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
  • -maxdepth:查找最大目录层数 如 1,即只查找一层目录。
  • -fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件 /etc/fstab 中找到,该配置文件中包含了本系统中有关文件系统的信息。
  • -mount:在查找文件时不跨越文件系统 mount 点。
  • -follow:如果 find 命令遇到符号链接文件,就跟踪至链接所指向的文件。
  • -cpio:对匹配的文件使用 cpio 命令,将这些文件备份到磁带设备中。

2. 输出形式

  • -print:打印出 find 命令对查找的结果。默认就是该输出形式,类似的还有 -printf、-print0。
  • -exec:find 命令对查找的结构再次执行该参数所给出的其他 linux 命令。
  • -ok:和 -exec 作用相同,只不过会和用户交互,即 OK 执行前询问你是不是要执行。
  • -ls:以 ls -la 的形式打印出查找的结果。
  • -delete:对查找结果执行删除操作。

3. -exec 使用语法

语法形式:

-exec (command) {} \;

示例:

# 在当前路径下搜索后缀为 txt 的文件,并对结果执行 basename 操作(只显示文件名)
find . -name "*.txt" -exec basename {} \;
# 在当前路径下搜索后缀为 log 的文件,并对结果执行 rm -f 操作(删除)
find . -name "*.log" -exec rm -f {} \;

 

四、实例大全

1. 通过名称查找

# 在 ~ 目录下查找命名为 test.txt 的文件,~ 目录指用户的根目录
find ~ -name “test.txt”
# 在当前目录下查找后缀为 .txt 的文件
find . -name “*.txt”
# 在 ~/path1 和 ~/path2 两个目录下查找命名为 test.txt 的文件,~ 目录指用户的根目录
find ~/path1 ~/path2 -name “test.txt”

2. 通过文件权限查找

# 在当前目录下查找权限为 666 的文件
find . -perm 666
# 在当前目录下查找权限为 777 并且后缀为 .sh 的文件
find . -perm 777 -name "*.sh"

3. 根据文件类型查找

# 在当前目录下查找类型为 "d"(文件夹)的文件
find . -type d
# 在当前目录下查找类型不为 "d"(文件夹)的文件
find . ! -type d

4. 根据文件所属用户和用户组查找

# 在当前目录下查找没有归属用户的文件
find . -nouser
# 在 /home/afei/demo 目录下查找用户组为 users,所属用户为 afei 的文件
find /home/afei/demo -user afei -group users

5. 根据文件大小查找

# 在当前目录下查找文件大小小于 10 块的文件,没有单位默认为块,一块等于 512b
find . -size -10
# 在 ~/Downloads 目录下查找文件大小大于 100M 的文件
find ~/Downloads -size +100M

6. 根据修改时间查找

# 在当前目录下查找 5 天之内修改过的文件,- 表示之内,即修改时间没超过 5 天
find . -mtime -5
# 在当前目录下查找 5 分钟之前修改过的文件,+ 表示之前,即修改时间超过了 5 分钟
find . -mmin +5

7. 组合条件查找

  • -o 或者 -or 表示“或” 操作
  • -a 或者 -and 表示 “与” 操作
  • ! 表示 “非” 操作
  • 使用 () 表达式的话前面需要使用反斜杠 \ 转义,且括号内首尾必须要留一个空格
# 在当前目录下查找后缀为 .sh 或者 .txt 的文件
find . \( -name "*.sh" -o -name "*.txt" \)
# 在当前目录下修改时间在 1 天以内,5 分钟以外的文件
find . \( -mtime -1 -a -mmin +10 )
# 在当前目录下查找类型不为 "d"(文件夹)的文件
find . ! -type d

8. 输出形式

-exec 后面跟随一个命令,后面的 {} 表示前面查询的结果文件,末尾为 \; 且一定要留有一个空格

# 在当前目录下查找后缀为 .txt 的文件,并对查找结果执行 ls -la 的操作来显示
find . -name "*.txt" -exec ls -la {} \;
# 在当前目录下查找后缀为 .txt 的文件,并对查找结果执行移动到上一层的操作
find . -name "*.txt" -exec mv {} .. \;
# 在当前目录下查找后缀为 .txt 的文件,并在结果中查找含有 "afei" 字符的文件
find . -name ".txt" -exec grep -lnR "afei" {} \;
# 在当前目录下查找后缀为 .log 的文件,并删除这些文件
find . -name "*.log" -delete
# 在当前目录下查找后缀为 .txt,修改时间在 1 天以内的文件,并使用 ls 显示
find . -name "*.txt" -mtime -1 -ls

Logo

更多推荐