通过 find命令,可以很方便的查找符合目标类型的文件,例如多长时间内修改过的文件,大小范围内的文件等,配合一些其他的操作,例如删除操作。

find命令 基本语法: find [path] [option] [expression]

例子

基本操作

列出当前目录及其子目录的文件:

1
2
3
4
5
6
7
8
# 直接使用find即可
$ find
.
./去除awk截取参数中的换行符.md
./Linux命令find.md
./README.md
./Linux命令awk.md
./Linux命令sed.md

找出特定格式的文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ find ../Image/ -name "*.jpg"
../Image/Python/同步与异步/DiffBetweenThreadAndCoro.jpg
../Image/Python/GIL全局解释器锁/GIL_with_diff_CPU.jpg
../Image/Python/hashcat使用说明/increment_set_8_9.jpg
../Image/Python/hashcat使用说明/increment_not_set.jpg
...

# 在目录深度的最大范围为2的目录中查找指定格式的文件,只有三个
$ find ../Image/ -maxdepth 2 -name "*.jpg" 
../Image/Docker/get_master_nil.jpg
../Image/Docker/diff_between_run_create.jpg
../Image/Docker/get_master_success.jpg

查找时间范围内的文件

时间范围选项:

  • atime/天,amin/分钟: a表示 accessed,按照用户最近一次访问(存取过)时间来过滤。
  • ctime/天,cmin/分钟: c表示 change,按照文件数据元(例如权限等)最近一次修改时间来过滤。
  • mtime/天,mmin/分钟: m表示 modified,按照用户最近一次修改时间来过滤。
  • newer file: 查找比 file 修改时间更长的文件。(newer 表示file更新一点)
  • anewer file: 查找比 file 存取时间更长的文件。
  • cnewer file: 查找比 file 修改时间更长的文件。

对于前六个参数的时间范围:

  • -atime -7 表示在七天内修改过。
  • -atime 7 表示正好在七天前修改过。
  • -atime +7 表示修改时间超过七天。

例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 找出特定时间范围内的文件
$ find ../Image/ -name "*.jpg" -ctime -30 | xargs ls -l
-rw一点-rw-r-- 1 alfons alfons  79076 3月   9 21:57 ../Image/Docker/dif一点f_between_run_create.jpg
-rw一点-rw-r-- 1 alfons alfons 154655 3月   9 21:57 ../Image/Docker/get一点_master_nil.jpg
-rw-rw-r-- 1 alfons alfons 156051 3月   9 21:57 ../Image/Docker/get_master_success.jpg
-rw-r--r-- 1 alfons alfons 211543 2月  20 22:25 ../Image/Python/DoubanMovie爬虫/1_new_search_subjects.jpg
-rw-rw-r-- 1 alfons alfons   5366 1月  14 10:49 ../Image/Python/DoubanMovie爬虫/5_captcha.jpg

# 找到比READM.md更老的文件
$ ls -l README.md 
-rw-rw-r-- 1 alfons alfons 9 7月  18  2018 README.md

$ find ../Image/ -name "*.jpg" -newer README.md | xargs ls -l
-rw-rw-r-- 1 alfons alfons  84299 9月  28 22:33 ../Image/Books/OtherBooks/见识.jpg
-rw-rw-r-- 1 alfons alfons  26541 11月  4 21:26 ../Image/Books/OtherBooks/今日简史.jpg
....

根据文件类型查找

基本命令格式: find . -type [类型参数]

类型参数:

  • f: 普通文件。
  • l: 链接符号。
  • d: 目录。
  • c: 字符设备。
  • b: 块设备
  • s: sock套接字。
  • p: FIFO。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 查找本地文件夹内七天前修改过的普通文件
$ find . -type f -ctime +7 | xargs ls -l
-rw-rw-r-- 1 alfons alfons 9 7月  18  2018 ./README.md

# 查找修改日期超过七天的文件夹
$ find .. -maxdepth 1 -type d -ctime +7 | xargs ls -l -d
drwxr-xr-x   3 alfons alfons 4096 12月 17 21:06 ../Algorithms
drwxr-xr-x   4 alfons alfons 4096 7月  18  2018 ../Books
drwxrwxr-x   3 alfons alfons 4096 11月 10 17:05 ../C++
drwxr-xr-x   2 alfons alfons 4096 7月   7  2018 ../LeetCode
drwxrwxr-x 149 alfons alfons 4096 7月  31  2018 ../node_modules
drwxr-xr-x   6 alfons alfons 4096 1月  30 13:26 ../Python
drwxrwxr-x   2 alfons alfons 4096 7月   7  2018 ../.vscode
drwxrwxr-x   2 alfons alfons 4096 1月  30 13:43 ../陈皓专栏笔记
drwxrwxr-x   2 alfons alfons 4096 2月  17 21:28 ../随笔
drwxrwxr-x   2 alfons alfons 4096 12月 16 21:52 ../《左耳听风每周练习》

根据文件大小查找

按文件大小查找需要用到 -size n 选项,后面跟单位选项:

  • b: 块(512字节)
  • c: 字节
  • w: 字(2字节)
  • k: 千字节
  • M: 兆字节
  • G: 吉字节

n 的大小和上面时间的使用一样, + 表示超过n大小的文件, - 表示小于n大小的文件。

找到大小大于 10KB 的md文件:

1
2
3
4
5
6
7
$ find . -type f -name "*.md" -size +10k | xargs ls -l -h
-rw-rw-r-- 1 alfons alfons 17K 12月  2 20:08 ./Algorithms/AlgorithmsArea/红黑树.md
-rw-rw-r-- 1 alfons alfons 14K 11月  6 23:24 ./Books/OtherBooks/见识.md
-rwx------ 1 alfons alfons 28K 10月 17 15:15 ./Books/ProfessionBooks/MySQL必知必会/2_MySQL基本操作.md
-rwx------ 1 alfons alfons 13K 10月 18 17:39 ./Books/ProfessionBooks/MySQL必知必会/3_MySQL高级操作_聚集和分组.md
-rwx------ 1 alfons alfons 14K 10月 23 20:13 ./Books/ProfessionBooks/MySQL必知必会/4_MySQL高级操作_联结查询.md
...

找到文件后的操作

大部分时候,我们查找到文件后,需要对文件进行一些操作。需要用到 -exec 或者 -ok 选项,后面跟的都是 shell命令

命令格式:find . -type f -exec rm {} \;

-exec-ok 的不同之处在于,-exec 会直接执行后续的操作。而 -ok 选项需要用户确认是否执行后续的选项。

后面的 {} 表示的是待处理的已经找到的目标文件。

-exec 必须由一个 ; 结束,之所以使用 \;,是转义的意思,shell脚本通常会对 ; 进行处理。

找到目标文件并删除:

1
2
3
4
5
6
# 使用 -exec 选项不会出现确认选项
$ find . -type f -size -8c -exec rm {} \;

# 而使用 -ok 选项则会出现用户确认
$ find . -type f -size -8c -ok rm {} \;
< rm ... ./wait_del.txt > ? y

比较推荐的是 使用管道的方式 来对找到的目标文件进行处理。

1
2
3
# 有些命令不支持管道操作,需要使用xargs命令做下中转
$ find . -type f -size -10c | xargs ls -l
-rw-rw-r-- 1 alfons alfons 9 7月  18  2018 ./README.md

参考