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 \; |