UNIX/linux的find命令细节

来源:互联网 发布:网络推广年度总结 编辑:程序博客网 时间:2024/04/28 13:45

find 命令的工作方式如下:

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


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

选项-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] +

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


2否定参数 !

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

find . ! -name "*.txt" -print

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


3 基于目录深度的搜索

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

find . -maxdeoth 1 -print 

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

find . -mindepth 2 -print

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


4 根据文件类型搜索

find . -type d -print

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

文件类型                类型参数

普通文件                f

符号连接                l

目录                       d

字符设备                c

块设备                    b

套接字                    s

Fifo                        p


5 根据文件时间进行搜索

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



6基于文件大小搜索

find . -size +2k

大于2k的文件

find . -size -2k

小于2k的文件

find .-size 2k

等于2k的文件

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

b------块  512字节

c------字节

w-----字  2字节

k-----千字节

m----兆字节

G----吉字节

7删除匹配文件

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

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

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

find . -perm 644 -print

find . -user huangyuan -print

8结合 find 执行命令或动作

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

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

find . -name "*.c" -exec cat {} \;> all_C_file.txt

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

9跳过指定目录

find .  \( -name ".get" -prune  \) -o  \( -print \)

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


0 0
原创粉丝点击