摘要
find 是Unix/Linux命令行工具箱中最棒的工具之一。该命令在命令行和shell脚本编写方面都
能发挥功效。find 包含大量特性,本文记录find 的一些常用的查找功能。
find 命令的工作方式如下:沿着文件层次结构向下遍历,匹配符合条件的文件,执行相应
的操作。默认的操作是打印出文件和目录,这也可以使用 -print 选项来指定。
基本用法
find . -print# orfind .
限定参数
find 命令能够基于通配符或正则表达式、目录树深度、文件日期、文件类型等条件查找文件。
1. 根据文件名或正则表达式进行搜索
文件名匹配
-name 选项指定了待查找文件名的模式。这个模式可以是通配符,也可以是正则表达式。在
下面的例子中, '*.txt' 能够匹配所有名字以.txt结尾的文件或目录。
find . -name '*.txt' -print
注意 *.txt 两边的单引号。shell会扩展没有引号或是出现在双引号( " )中的通配符。单引号能够阻止shell扩展 *.txt ,使得该字符串能够原封不动地传给find 命令。
忽略文件名大小写
使用-iname参数选项
find . -iname "example*" -print
逻辑操作
find 命令支持逻辑操作符。 -a 和 -and 选项可以执行逻辑与(AND)操作, -o 和 -or 选项可
以执行逻辑或(OR)操作。
find . \( -name '*txt*' -or -name '*sh' \)
限制所匹配文件的路径
-path选项可以限定路径
find /home/users -path '*/slynux/*' -name '*.txt' –print
上例能够匹配文件/home/users/slynux/readme.txt,但无法匹配/home/users/slynux.txt。
2. 否定参数
find 也可以用 ! 排除匹配到的模式,下面的 find 命令能够匹配所有不以.txt结尾的文件。
find . ! -name "*.txt" -print
3. 基于目录深度的搜索
find 命令在查找时会遍历完所有的子目录。默认情况下, find 命令不会跟随符号链接。 -L
选项可以强制其改变这种行为。但如果碰上了指向自身的链接, find 命令就会陷入死循环中。
-maxdepth 和 –mindepth 选项可以限制 find 命令遍历的目录深度。这可以避免 find 命令没完没了地查找。
4. 根据文件类型搜索
类Unix系统将一切都视为文件。文件具有不同的类型,例如普通文件、目录、字符设备、块设备、符号链接、硬链接、套接字以及FIFO等。
find 命令可以使用 -type 选项对文件搜索进行过滤。借助这个选项,我们可以告诉 find 命令只匹配指定类型的文件。
只列出所有的目录(包括子目录):
find . -type d -print
只列出普通文件:
find . -type f -print
只列出符号链接:
find . -type l -print
类型与参数
5. 根据文件的时间戳进行搜索
Unix/Linux文件系统中的每一个文件都有3种时间戳,如下所示:
- 访问时间(-atime):用户最近一次访问文件的时间。
- 修改时间(-mtime):文件内容最后一次被修改的时间。
- 变化时间(-ctime):文件元数据(例如权限或所有权)最后一次改变的时间。
打印出在最近7天内被访问过的所有文件
find . -type f -atime -7 -print
打印出恰好在7天前被访问过的所有文件
find . -type f -atime 7 -print
打印出访问时间超过7天的所有文件
find . -type f -atime +7 -print
-mtime选项会根据修改时间展开搜索,-ctime会根据变化时间展开搜索。
-atime、-mtime以及-ctime都是以“天”为单位来计时的。find命令还支持以“分钟”
为计时单位的选项。这些选项包括:
- -amin(访问时间)
- -mmin(修改时间)
- -cmin(变化时间)
6. 基于文件大小的搜索
大于2KB的文件
find . -type f -size +2k
小于2KB的文件
ind . -type f -size -2k
大小等于2KB的文件
find . -type f -size 2k
文件大小单位
除了 k 之外,还可以用其他文件大小单位。
- b :块(512字节)
- c :字节
- w :字(2字节)
- k :千字节(1024字节)
- M :兆字节(1024K字节)
- G :吉字节(1024M字节)
7. 基于文件权限和所有权的匹配
可以根据文件权限进行文件匹配。列出具有特定权限的文件:
打印出权限为644的文件
find . -type f -perm 644 -print
-perm 选项指明 find 应该只匹配具有特定权限值的文件。
-user USER 指定某个特定用户所拥有的文件。 参数 USER 可以是用户名或UID。
find . -type f -user slynux -print
8. 利用find执行相应操作
find 命令能够对其所查找到的文件执行相应的操作。无论是删除文件或是执行任意的Linux
命令都没有问题。缺省执行的命令是-print
删除匹配的文件
find . -type f -name "*.swp" -delete
执行命令
利用 -exec 选项, find 命令可以结合其他命令使用。
find . -type f -user root -exec chown slynux {} \;
注意该命令结尾的 \; 。必须对分号进行转义,否则shell会将其视为 find 命令的结束,而非 chown 命令的结束。
以将10天前的 .txt文件复制到OLD目录中
find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;
9. 让find跳过特定的目录
跳过.git目录
find . -name '.git' -prune -o -type f -print
其中,-name ".git" –prune 是命令中负责进行修剪的部分,它指明了.git目录应该被排除在外。-type f –print 描述了要执行的操作。