Linux工具-find
参考文献
find
1 | # find [PATH] [option] [action] |
示例
-
要列出当前目录以及子目录下所有的文件和文件夹:
find base_path
1
2
3
4# '\n'作为用于分割文件的定界符
find . -print
# 指明'\0'作为定界符
find . -print0 -
根据文件名或正则表达式匹配搜索
1
2
3
4
5
6
7find base_path -name "*.txt" -print
find . -name ".txt" -print
# 匹配名字时忽略字母大小
find base_path -iname "*.txt" -print
# 匹配多个条件可以采用OR条件操作
find . \( -name "*.txt" -o -name "*.pdf" \) -print -
否定参数
1
2
3
4find . ! -name "*.txt" -print
# 删除所有不是以 .zip 结尾的文件和文件夹
find . -type f ! -name "*.zip" -delete
find . -type d ! -name "*.zip" -exec rm -r {} + -
基于目录深度
1
2
3
4
5
6find -maxdepth/-mindepth 1 -type f -print
# 统计每个文件夹中的文件数量
find /path/to/directory -mindepth 1 -maxdepth 1 -type d | while read dir; do
count=$(find "$dir" -maxdepth 1 -type f | wc -l)
echo "$dir: $count files"
done -
根据文件类型搜索
1
2
3
4
5
6
7
8find . -type d -print
* 普通文件 f
* 符号连接 l
* 目录 d
* 字符设备 c
* 块设备 b
* 套接字 s
* Fifo. p -
根据文件时间搜索
-
访问时间(-atime):用户最近一次访问文件的时间;
-
修改时间(-mtime):文件内容最后一次被修改的时间;
-
变化时间(-ctime):文件元数据(metadata,例如权限或所有权)最后一次改变时间;
- 计量单位为天
1
2
3
4
5
6
7
8
9
10# 打印出最近7天被访问过的所有文件
find . -type f -atime -7 -print
# 打印出恰好在七天前被访问过的所有文件
find . -type f -atime 7 -print
# 打印出访问时间超过七天的所有文件
find . -type f -atime +7 -print
# 查找一段时间内修改的文件
find . -type f -newermt "2024-03-06 21:00:00" ! -newermt "2024-03-06 23:59:59"
# 查找最近10分钟内修改的文件
find /home/user/ -cmin 10 -print- -amin(访问时间)
- -mmin(修改时间)
- -cmin(变化时间)
- 计量单位为分钟
-
-
基于文件大小的搜索
1
2
3
4
5
6
7
8
9# 大于2K的文件
find . -type f -size +2k
# 小于2K的文件
find . -type f -size -2k
# 等于2K的文件
find . -type f -size 2k
# 查找大于10M的文件
find . -xdev -size +10M -type f -print0 | xargs -0 ls -Ssh1 --color- 块(b) 512字节
- 字节©
- 字(w) 2字节
- 千字节(k)
- 兆字节(M)
- 吉字节(G)
-
删除匹配的文件
1
find . -type f -name "*.txt" -delete
-
基于文件权限和所有权的匹配
1
2
3
4
5find . -type f -perm 644 -print
# 查找不能被所有用户可读的文件
find . -type f ! -perm -444
# 查找不能被所有用户访问的文件
find . -type d ! -perm -111 -
结合find执行命令或动作
- find命令可以借助选项
-exec
与其他命令进行结合。
1
2
3
4
5
6
7
8
9
10# {}是一个特殊的字符串,与-exec选项结合使用,对于每个一个匹配的文件{},会被替换成相应的文件名
# find命令找到来那个文件test1.txt和test2.txt,其所有者均为slynux
find . -type f -user root -exec chown slynux {} \;
# 将给定目录中所有的C程序文件拼接起来写入单个文件all_c_files.txt
# 使用>操作符,没有使用>>(追加)的原因是因为find命令的全部输出只是一个单数据流(stdin),而只有当多个数据流被追加到单个文件中的时候才有必要使用>>.
find . -type f -name "*.c" -exec cat {} \;>all_c_files.txt
# 将10天前的.txt文件复制到OLD目录中
find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;-
无法在
-exec
参数中直接使用多个命令,只能够接受单个命令,但是可以吧多个命令写入到一个shell脚本中,再执行-exec
1
-exec ./commads.sh {} \;
- find命令可以借助选项
-
让find跳过特定的目录
1
2# \( -name ".git" -prune \) 用于排除
find devel/souce_path \( -name ".git" -prune \) -o \( -type f -print\)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HoleLin's Blog!