欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux命令之文件查找:find 命令详解

程序员文章站 2022-07-12 14:34:41
...

一、说明

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

相关标签: find