0%

UNIX/linux的find命令细节

find 命令的工作方式如下:

沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作.

根据文件名或者正则表达式匹配搜索

选项-name的参数指定了文件名所必须匹配的字符串,我们可以将通配符作为参数使用.”*.txt” 可以匹配所有的以”.txt”结尾的文件.选项-print 在终端中打印出符合条件的文件名或者文件路径,这些匹配条件作为find 的参数给出

find /home/huangyuan -name “*.txt” -print

find 有一个选项-iname 可以忽略文件名的大小写

如果想匹配多个条件中的一个,可以使用 OR 条件操作

find . (-name “.txt” -o -name “.pdf”) -print

上面的代码会打印出所有的 “.txt” 和 “.pdf” 文件,是因为这个find 命令可以匹配所有的这两类文件

其中, “(“ 和 “)“ 用于将 -name “.txt” -o -name “.pdf” 视为一个整体

选项 -path 可以使用通配符来匹配文件路径或者文件名

选项 -regex 是基于正则表达式来匹配文件路径货文件.正则表达式是通配符的高级形式,例如,可以使用正则表达式来匹配Email ,一个 Email 的形式通常是 name@host.root

所以可以将其一般化为 [0-9a-zA-A]+@[0-9a-zA-A]+.[0-9a-zA-A] +

“+” 指明在它之前的字符类中字符可以出现一次或者多次

否定参数 !

find 也可以用 “!” 来否定参数的含义

find . ! -name “*.txt” -print

上面的命令可以用来 匹配所有不以 “.txt” 结尾的文件

基于目录深度的搜索

find 命令在使用时会遍历所有的子目录,我们可以使用 -mindepth 和 -maxdepth 来限制搜索子目录的深度

find . -maxdeoth 1 -print

这条目录只会打印当前目录中的所有文件,而不会打印子目录中的文件

find . -mindepth 2 -print

这条目录打印目录深度至少为2 的文件

根据文件类型搜索

find . -type d -print

上面的命令只会打印出目录

文件类型 类型参数

普通文件 f

符号连接 l

目录 d

字符设备 c

块设备 b

套接字 s

Fifo p

根据文件时间进行搜索

unix/linux 文件系统中的每一个文件都有三种时间戳(timestamp) ,如下所示

访问时间 (-atime) : 用户最近一次访问文件的时间

修改时间 (-mtime): 文件内同最后一次被修改的时间

变化时间 (-ctime) : 文件元数据(metadata,例如权限或者所有权)最后一次被修改的时间

在unux/linux中没有创建时间这个概念

-atime,-mtime,-ctime 可以作为 find 的时间参数,例如

打印出 最近七天内被访问过的文件

find . -atime -7 -print

打印出 刚好七天前访问过的文件

find . -atime 7 -print

打印出 访问时间超过7天的文件

find . -atime +7 -print

还有其他一些基于时间的参数 (以分钟为单位)

-amin

-mmin

-cmin

基于文件大小搜索

find . -size +2k

大于2k的文件

find . -size -2k

小于2k的文件

find .-size 2k

等于2k的文件

除了K之外,还有其他单元

b——块 512字节

c——字节

w—–字 2字节

k—–千字节

m—-兆字节

G—-吉字节

删除匹配文件

-delete 可以删除 find 查找到的匹配文件

find . -name “*.flv” -delete ##(删除所有flv文件)

基于文件权限和所有权的匹配

find . -perm 644 -print

find . -user huangyuan -print

结合 find 执行命令或动作

find 命令可以借助选项 -exec 与其他命令结合

例如 将制定目录中的所有C程序文件拼接起来写入单个文件 all_C_file.txt

find . -name “*.c” -exec cat {} ;> all_C_file.txt

-exec 后面可以接任何命令.{}表示一个匹配.使用 > 而不使用 >> 的原因是 find 命令的输出只是一个单数据流,而只有当多个数据流被追加到单个文件中的时候才有必要用 >>

跳过指定目录

find . ( -name “.get” -prune ) -o ( -print )

这条命令中 (-name “.git” -prune ) 指明 .git 目录应该排除掉, 而 ( -print ) 指明了执行的动作.这些动作需要放在第二个语句块中.