通过 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
  | 
参考
Author
Alfons
LastMod
2019-03-23
License
Creative Commons BY-NC-ND 3.0