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作用就是表示排除,说明排除那些特定的目录

发表评论

邮箱地址不会被公开。 必填项已用*标注