Linux命令之文件查找:find 命令详解
一、说明
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
上一篇: 1、集合练习
下一篇: 十四、mongoDB之find操作