find 命令算是平时使用频率较高的一个命令了,因为经常需要搜索相关的文件,熟悉它的常见使用方法,对工作是很有帮助的。这篇文章来总结下如何用好 find 命令。
1. 根据文件名查找
find 最常见的使用方法就是根据文件名来进行查找了。
查找当前目录 . 下文件名为 hello.txt 的文件:
1 | find . -name "hello.txt" |
查找当前目录 . 下文件后缀名为 .py 的文件(使用通配符 *):
1 | find . -name "*.py" |
那如果加个否定,查找当前目录下文件后缀名不是 .py 的文件:
1 | find . ! -name "*.py" |
忽略文件大小写,查找当前目录 . 下文件名中包含 test 的普通文件:
1 | find . -type f -iname "*test*" |
2. 根据文件类型查找
如果需要查找指定类型的文件,需要跟 -type 参数。
type 参数的主要取值有(不包括全部):
-f: 普通文件;-d: 目录;-l: 连接文件;-s: socket 类型文件。
查找当前目录下以 test 打头的目录:
1 | find . -type d -name "test*" |
3. 根据文件大小查找
如果需要利用文件大小来做筛选,可以跟 -size 参数。
-size 参数的单位主要有(不包括全部):
-c: 字节 Byte;-k: 千字节,KB;-M: 兆字节,MB;-G: GB。
此外,还有加号 + 和减号 - 有大小含义:
+50M: 表示大于 50M 的文件;-50M: 表示小于 50M 的文件;50M: 表示大小刚好是 50M 的文件。
查找当前目录下大于 100M 的普通文件:
1 | find . -type f -size +100M |
4. 根据时间查找
find 命令后面可跟的时间参数主要有 3 个,单位都是 “天”:
-mtime: modified time,表示修改时间;-atime: accessed time,表示访问时间;-ctime: changed time,表示修改时间。
同 -size 参数一样,时间参数同样可以配合加号 + 和 减号 - 一起使用:
+n: 表示 n 天之前的,不包括 n 天本身;-n: 表示 n 天以内的,包含 n 天本身;n: 表示 n 天当天。
举个例子,我们需要找出当前目录下超过 10 天的没有被访问过的普通文件:
1 | find . -type f -atime +10 |
同样,找出当前目录下 5 天之内被修改的普通文件:
1 | find . -type f -mtime -5 |
5. 根据文件所有者和权限查找
需要使用 -user 和 -perm 参数。
例如,找出 / 目录下文件拥有者是 ubuntu 的所有普通文件:
1 | find / -type f -user ubuntu |
找出当前目录下所有权限为 655 的普通文件:
1 | find . -type f -perm 655 |
6. 限制查找深度
可以使用 -maxdepth 和 -mindepth 两个参数来控制查找的深度,因为默认情况下,find 命令会查找其后所跟的目录及其所有子目录。
如果只查找当前目录本身,不深入其子目录查找,可以设置 -maxdepth 1 :
1 | find . -maxdepth 1 -name "*.py" |
如果需要查找当前目录的子目录中所包含的 .py 文件,可以加上 -mindepth 2 参数:
1 | find . -mindepth 2 -maxdepth 2 -name "*.py" |
*注:这两个参数不要同 -type 参数一同使用(尝试后发现不行)
7. 查找完执行额外的动作
默认情况下 find 命令查找结束后,会将结果输出到屏幕上。如果我们想要对所有查找到的结果做一些处理,可以使用 -exec 参数。
拿一个例子说明。
1 | find /usr/bin /usr/sbin -perm 644 -exec ls -l {} \; |
有 3 个需要注意的地方:
-exec: 跟在find命令的最后,表示执行额外的动作;{}: 表示find命令找到的所有内容;\;: 表示额外动作的结束。
另一个例子:将当前目录下超过 10 天未被访问的文件移动到 ./expired 目录下:
1 | find . -type f -atime +10 -exec mv {} ./expired \; |
最后一个例子,批量修改文件权限:将当前目录下权限为 644 的普通文件,权限修改为 655 :
1 | find . -type f -perm 644 -exec chmod {} 655 \; |