find这个命令是UNIX/Linux工具箱中最棒的工具之一,对编写Shell脚本很有用,但是很多人对其缺乏认知,不能很好的使用
首先是find 查询目录下所有的文件和文件夹
find base_path
bash_path可以是任何位置,find会从该位置开始向下查询
例子:
find .- print
打印文件和目录的列表
.是当前的目录 ..是父目录
-print说明打印出所有的文件或路径 其实系统默认已经加上了
-print0说明是使用 ‘\0’ 来打印每一个匹配的文件名
find还可以配合文件名或者正则表达式来匹配搜索
-name 的参数指定了文件名必须匹配的字符串,可以将通配符作为参数来使用 *.txt 匹配所有.txt结尾的文件名,选项-print 在终端之中打印出符合条件的文件名或者文件路径
find /home/slynux -name “*.txt” -print
find 命令可以使用 -iname 来忽略大小写
而且可以使用逻辑运算符来进行条件运算
find .\(-name “*.txt” -o -name “*.pdf” \) -print
\(\)用于将-name “*.txt” -o -name “*.pdf” 视为了一个整体
-regex的参数和-path的类型,不过-regex是通过正则表达式来匹配路径的,正则表达是通过通配符匹配的高级形式,可以指定文本模式,我们借助这个模式可以匹配并打印文本
我们使用如下的命令来匹配.py和.sh文本
find . regex “.*\(\.py\|\.sh\)$”
类似的 -iregex 用于忽略正则表达式的大小写
find . -iregex “.”\(\.py\ |\.sh\)$”
./test.py
./new.PY
否定参数
find 可以用 “!” 否定参数的含义
find .! -name “*.txt” -print
上面的命令匹配所有不以.txt结尾的文件名
基于目录深度的搜索
find在使用的时候会遍历所有的子目录,我们可以采用一些深度参数来限制 find命令遍历的深度
-maxdepth和mindepth就是这种参数
大多数时候,一般在本目录之中查找,而不是递归遍历,如果只允许find在当前目录中查找,可以设置下潜深度为1,如果只查询向下两级的目录,深度可以设置为2
比如,如下的命令
find . -maxdepth 1 -type f -print
只会列出当前目录下的所有普通文件
-maxdepth 2最多往下遍历两级子目录
小建议,-maxdepth和-mindepth应该作为find的第3-4个参数出现,如果作为第4个之后的参数出现,可能影响到find的效率,做一些不必要的检查
因为可以很快的减少查找范围
根据文件类型进行搜索
UNIX系统将一切都视为文件,文件具有不同的类型,例如普通文件,目录,字符设备,块设备,符合连接,硬连接,套接字及FIFO等
-type 可以对文件搜索进行过滤,借助这个选项,可以为find命令指定特定的文件类型
比如 d是目录
find . -type d -print
普通文件 f
find . -type f -print
剩下的文件类型在如下表所示
根据文件时间进行搜索
Unix/Linux文件系统中每一个文件都有三种时间戳(timestamp)
访问时间 -atime 最近一次访问时间
修改时间 -mtime 最后一次修改时间
变化时间 -ctime 文件元数据最后一次修改时间
这样可以作为find的参数,其单位一般为天,而且可以加上 – + 表达
大于 小于
获取最近7天被访问的所有文件
find . -type f -atime -7 print
打印出恰好在近七天内被访问到的所有文件
find . -type f -atime 7 -print
打印恰好7天前被访问的文件
同理使用 -mtime -ctime,不过这些计量单位是天
以更小粒度的计量单位为
-amin
-mmin
打印出超过7分钟的所有文件
find . -type f -amin +7 -print
并且可以利用一个文件的更新时间更长的更新时间的文件
比如,找出比file.txt修改时间更长的所有文件
find .-type f -newer file.txt -print
find命令的时间戳操作处理选项对编写系统备份和维护脚本很有用
还可以根据文件的大小进行搜索
find . type f -size +2k
大于2K的文件
除了 k,还能用其他的文件大小单元
b — 块
c — 字节
w — 字
k — 千
M — 兆
G
find还可以配合 -delete的命令来删除find查找到的匹配文件
find .-type f -name “*.swp” -delete
基于文件权限和所有权的匹配
find . -type f -perm 666 -print
打印出权限为666的文件
打印不是权限不为多少的文件
find . -type f -name “*.php” ! -perm 666 -print
或者是使用
find . -type f -user locker -print
结合find执行命令或者动作
-exec可以和其他的命令进行结合, 如何使用-exec选项
我们首先找到了所有需要查询到文件,然后对每一个查找的文件进行相关的操作
比如下面的更改所有权的操作
find . -type f -user root -exec chown locker {} \;
上面命令汇总 { }是一个特殊的字符串 在和-exec结合使用的时候,会将每一个文件替换进去
就是
chown locker test.txt
或者搜索并且输出打印
-exec之后可以接受任何的命令 {}会表示一个匹配,所以匹配的文件名,都会被替换进去
比如
find . -type f -name “*.c” -exec cat {} \;>all_files.txt
比如,下列命令将10天前的 .txt文件赋值到OLD目录中
find . -type f -mtime +10 -name “*.txt” -exec cp {} OLD \;
因为-exec后面只能跟一个命令
那么可以将多个命令写到一个shell脚本中,然后在-exec中使用这个脚本
-exec ./commands.sh {} \;
让find跳过特定的目录
我们为了跳过一些不需要的目录,可以再其中加上一些语句从而避免搜索
find devel/source_path \(-name “.git” -prune \) -o\(-tpye f -print)
-prune作用就是表示排除,说明排除那些特定的目录