参考文献

find

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# find [PATH] [option] [action]

参数:
1. 与时间有关的参数:
-atime n : n 为数字,意义为在 n 天之前的『一天之内』被 access 过的档案;
-ctime n : n 为数字,意义为在 n 天之前的『一天之内』被 change 过状态的档案;
-mtime n : n 为数字,意义为在 n 天之前的『一天之内』被 modification 过的档案;
-newer file : file 为一个存在的档案,意思是说,只要档案比 file 还要新,
就会被列出来~
2. 与使用者或群组名称有关的参数:
-uid n : n 为数字,这个数字是使用者的账号 ID,亦即 UID ,这个 UID 是记录在
/etc/passwd 里面与账号名称对应的数字。这方面我们会在第四篇介绍。
-gid n : n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在
/etc/group,相关的介绍我们会第四篇说明~
-user name : name 为使用者账号名称喔!例如 dmtsai
-group name: name 为群组名称喔,例如 users ;
-nouser : 寻找档案的拥有者不存在 /etc/passwd 的人!
-nogroup : 寻找档案的拥有群组不存在于 /etc/group 的档案!
当您自行安装软件时,很可能该软件的属性当中并没有档案拥有者,
这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。
3. 与档案权限及名称有关的参数:
-name filename: 搜寻文件名称为 filename 的档案;
-size [+-]SIZE: 搜寻比 SIZE 还要大(+)或小(-)的档案。这个 SIZE 的规格有:
c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB
还要大的档案,就是『 -size +50k 』
-type TYPE : 搜寻档案的类型为 TYPE 的,类型主要有: 一般正规档案 (f),
装置档案 (b, c), 目录 (d), 连结档 (l), socket (s),
及 FIFO (p) 等属性。
-perm mode : 搜寻档案属性『刚好等于』 mode 的档案,这个 mode 为类似 chmod
的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !
-perm -mode : 搜寻档案属性『必须要全部囊括 mode 的属性』的档案,举例来说,
我们要搜寻 -rwxr--r-- ,亦即 0744 的档案,使用 -perm -0744,
当一个档案的属性为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,
因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。
-perm +mode : 搜寻档案属性『包含任一 mode 的属性』的档案,举例来说,我们搜寻
-rwxr-xr-x ,亦即 -perm +755 时,但一个档案属性为 -rw-------
也会被列出来,因为他有 -rw.... 的属性存在!
4. 额外可进行的动作:
-exec command : command 为其它指令,-exec 后面可再接额外的指令来处理搜寻到
的结果。
-print : 将结果打印到屏幕上,这个动作是预设动作!

示例

  • 要列出当前目录以及子目录下所有的文件和文件夹:find base_path

    1
    2
    3
    4
    # '\n'作为用于分割文件的定界符
    find . -print
    # 指明'\0'作为定界符
    find . -print0
  • 根据文件名或正则表达式匹配搜索

    1
    2
    3
    4
    5
    6
    7
    find base_path -name "*.txt" -print

    find . -name ".txt" -print
    # 匹配名字时忽略字母大小
    find base_path -iname "*.txt" -print
    # 匹配多个条件可以采用OR条件操作
    find . \( -name "*.txt" -o -name "*.pdf" \) -print
  • 否定参数

    1
    2
    3
    4
    find . ! -name "*.txt" -print
    # 删除所有不是以 .zip 结尾的文件和文件夹
    find . -type f ! -name "*.zip" -delete
    find . -type d ! -name "*.zip" -exec rm -r {} +
  • 基于目录深度

    1
    2
    3
    4
    5
    6
    find -maxdepth/-mindepth 1 -type f -print
    # 统计每个文件夹中的文件数量
    find /path/to/directory -mindepth 1 -maxdepth 1 -type d | while read dir; do
    count=$(find "$dir" -maxdepth 1 -type f | wc -l)
    echo "$dir: $count files"
    done
  • 根据文件类型搜索

    1
    2
    3
    4
    5
    6
    7
    8
    find . -type d -print
    * 普通文件 f
    * 符号连接 l
    * 目录 d
    * 字符设备 c
    * 块设备 b
    * 套接字 s
    * Fifo. p
  • 根据文件时间搜索

    • 访问时间(-atime):用户最近一次访问文件的时间;

    • 修改时间(-mtime):文件内容最后一次被修改的时间;

    • 变化时间(-ctime):文件元数据(metadata,例如权限或所有权)最后一次改变时间;

      • 计量单位为天
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 打印出最近7天被访问过的所有文件
    find . -type f -atime -7 -print
    # 打印出恰好在七天前被访问过的所有文件
    find . -type f -atime 7 -print
    # 打印出访问时间超过七天的所有文件
    find . -type f -atime +7 -print
    # 查找一段时间内修改的文件
    find . -type f -newermt "2024-03-06 21:00:00" ! -newermt "2024-03-06 23:59:59"
    # 查找最近10分钟内修改的文件
    find /home/user/ -cmin 10 -print
    • -amin(访问时间)
    • -mmin(修改时间)
    • -cmin(变化时间)
      • 计量单位为分钟
  • 基于文件大小的搜索

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 大于2K的文件
    find . -type f -size +2k
    # 小于2K的文件
    find . -type f -size -2k
    # 等于2K的文件
    find . -type f -size 2k

    # 查找大于10M的文件
    find . -xdev -size +10M -type f -print0 | xargs -0 ls -Ssh1 --color
    • 块(b) 512字节
    • 字节©
    • 字(w) 2字节
    • 千字节(k)
    • 兆字节(M)
    • 吉字节(G)
  • 删除匹配的文件

    1
    find . -type f -name "*.txt" -delete
  • 基于文件权限和所有权的匹配

    1
    2
    3
    4
    5
    find . -type f -perm 644 -print
    # 查找不能被所有用户可读的文件
    find . -type f ! -perm -444
    # 查找不能被所有用户访问的文件
    find . -type d ! -perm -111
  • 结合find执行命令或动作

    • find命令可以借助选项-exec与其他命令进行结合。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # {}是一个特殊的字符串,与-exec选项结合使用,对于每个一个匹配的文件{},会被替换成相应的文件名
    # find命令找到来那个文件test1.txt和test2.txt,其所有者均为slynux
    find . -type f -user root -exec chown slynux {} \;

    # 将给定目录中所有的C程序文件拼接起来写入单个文件all_c_files.txt
    # 使用>操作符,没有使用>>(追加)的原因是因为find命令的全部输出只是一个单数据流(stdin),而只有当多个数据流被追加到单个文件中的时候才有必要使用>>.
    find . -type f -name "*.c" -exec cat {} \;>all_c_files.txt

    # 将10天前的.txt文件复制到OLD目录中
    find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;
    • 无法在-exec参数中直接使用多个命令,只能够接受单个命令,但是可以吧多个命令写入到一个shell脚本中,再执行-exec

      1
      -exec ./commads.sh {} \;
  • 让find跳过特定的目录

    1
    2
    # \( -name ".git" -prune \) 用于排除
    find devel/souce_path \( -name ".git" -prune \) -o \( -type f -print\)