Linux 学习记录: find 命令

find 命令算是平时使用频率较高的一个命令了,因为经常需要搜索相关的文件,熟悉它的常见使用方法,对工作是很有帮助的。这篇文章来总结下如何用好 find 命令。

1. 根据文件名查找

find 最常见的使用方法就是根据文件名来进行查找了。

查找当前目录 . 下文件名为 hello.txt 的文件:

1
find . -name "hello.txt"

查找当前目录 . 下文件后缀名为 .py 的文件(使用通配符 *):

1
find . -name "*.py"

那如果加个否定,查找当前目录下文件后缀名不是 .py 的文件:

1
find . ! -name "*.py"

忽略文件大小写,查找当前目录 . 下文件名中包含 test 的普通文件:

1
2
3
find . -type f -iname "*test*"  
# 1. 忽略大小写的查找方法是使用参数 -iname,不是用 find -type f -i -name "*test*"
# 2. -type f 意思是查找普通文件,后面会解释

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

References

Donate comment here