Shell -- find 命令使用详解

感谢各位简友一直的关注。

请关注:感谢陪伴


翻译整理于:15 Super Useful Examples of the Find Command in Linux

感觉学会了这些可以节省不少代码量和运行时间耶 :)

觉得自己find白学的老铁抠波6

命令通常包含三部分:目录、选项、表达式

  • 指定要搜索的目录,默认当前目录
  • 指定搜索类型
  • 指定搜索的词条

当前目录下根据名字搜索文件或目录

find . -name SEARCH_NAME

仅搜索文件或目录

# only file
find . -type f -name SEARCH_NAME
# only directory
find . -type d -name SEARCH_NAME

不区分大小写

find . -type f -iname SEARCH_NAME

根据扩展名搜索

find . -type f -name "*.cpp"
  • 建议加上双引号,否则若存在多个匹配文件则会报错

多种扩展名

find . -type f -name "*.cpp" -o -name "*.R" -o -name "*.sh"

多个目录

find ./location1 /second/location -type f -name "pattern"

多重条件/逻辑运算符

选项:
-a:and逻辑与
-o:or逻辑或
-not:not逻辑非

-a: and 逻辑与

find 命令也支持逻辑运算符选项,其中 -a 代表逻辑与运算,也就是 -a 的两个条件都成立,find 搜索的结果才成立。

# 在当前目录下搜索大于2KB,并且文件类型是普通文件的文件
find.-size +2k -a -type f
# 在当前目录下搜索3天以内修改过,并且权限是644的文件
find.-mtime -3 -a -perm 644

-o: or 逻辑或

-o 选项代表逻辑或运算,也就是 -o 的两个条件只要其中一个成立,find 命令就可以找到结果。例如:

# 在当前目录下搜索文件名要么是cangls的文件,要么是bols的文件
find.-name cangls -o -name bols

-not: not 逻辑非

-not是逻辑非,也就是取反的意思。

# 在当前目录下搜索文件名不是cangls的文件
find.-not -name cangls

搜索空文件或目录

find . -empty
# 指定文件类型
find . -empty -type f
# 匹配文件名
find . -empty -type f -name "*.cpp"

根据文件大小

# 确定的大小
find . -size 50k
# 大于
find . -size +1G
# 小于
find . -size -20c
# 大于小于
find . -size +100M -size -2G
# 同时支持按文件名检索
find / -size +500M -name "*.log"

文件大小单位:

  • c : bytes
  • k: kilobytes
  • M: Megabytes
  • G: Gigabytes

搜索最近修改的

这个没意思,不整理了

搜索特定权限的文件

find . -perm 777
find . -perm a=r+w

设置搜索深度

# 只在当前目录搜索
find . -maxdepth 1 -type f -name "*.txt"

不搜索特定的目录

find . -path "./directory_exclude/*" -prune -o -name SEARCH_NAME

-prune始终与-o一起使用,以确保右侧的检索词只对没有被prune(修剪)的目录进行搜索

进一步处理搜索结果

使用 exec

列出搜索结果文件的详细信息(ls -l)
find . -type f -name "*.txt" -exec ls -l {} +

{} 保存find的结果, + 提示exec命令结果,可以用\;代替;但也有不同,+结尾对所有文件一起执行命令(ls -l file1 file2 file3),而\;结尾是对每一文件都执行命令(ls -l file1, ls -l file

比如,当需要对每一文件重命名时,就可以这样:

# 将*.txt"的文件重命名为*.txt.old"
find . -type f -name *.txt" -exec mv {} {}.old \;

使用 xargs

对于这种变量重定向,我们更常用的是xargs

find . -type f -name *.txt" | xargs ls -l

grep联用

# exec 
find . -type f -name "*.txt" -exec grep -i alice {} +
# xargs 
find . -type f -name "*.txt" | xargs grep -i alice

你可能感兴趣的:(Shell -- find 命令使用详解)