查看子文件夹中的文件个数及find命令解析

发布时间 2023-09-13 13:35:33作者: theSummerDay

查看子文件夹中的文件个数

find /home/test -type f -printf '%h\n' | sort | uniq -c

/home/test 要查找的目录
-type 按文件类型查找
f:指普通文件  d:目录文件
-printf 打印输出
%h 文件目录
\n 新行

sort 排序
uniq -c 去重并统计次数

测试

创建文件

当前目录 /home/test, 创建3个子文件夹a,b,c, a中有1个文件,b中有2个文件,c中有3个文件

[root@localhost test]# mkdir a b c
[root@localhost test]# touch a/a1.txt b/b1.txt b/b2.txt c/c1.txt c/c2.txt c/c3.txt
[root@localhost test]# tree -a
.
├── a
│   └── a1.txt
├── b
│   ├── b1.txt
│   └── b2.txt
└── c
    ├── c1.txt
    ├── c2.txt
    └── c3.txt

测试结果

[root@localhost test]# find /home/test -type f -printf '%h\n' | sort | uniq -c
      1 /home/test/a
      2 /home/test/b
      3 /home/test/c

find命令解析

命令格式

find [path...] [OPTIONS] [TESTS] [ACTIONS]
其中:
`path...` : 要查找路径, 可以有多个

选项 OPTIONS

-maxdepth levels: 子目录最大深度不超过levels
-mindepth levels: 子目录最小深度不低于levels
-version--version: 打印版本号

测试 TESTS

下面的数字参数n 可以这样给出
+n 比n大
-n 比n小
n 正好是n
-amin n:对文件的最近一次访问(比如 cat file)是在 n 分钟 (+n 就是n分钟之前, -n 就是n分钟以内)
-anewer file: 对文件的最近一次访问比 file 修改时间要晚
-atime n: 对文件的最近一次访问是在 n*24 小时之前

-cmin n: 对文件状态的最近一次修改是在 n 分钟之前
-cnewer file: 对文件状态的最近一次修改比 file 修改时间要晚
-ctime n: 对文件状态的最近一次修改是在 n*24 小时之前

-mmin n: 对文件数据的最近一次修改是在 n 分钟之前
-mtime n: 对文件数据的最近一次修改是在 n*24 小时之前
-newer file: 对文件的最近一次修改比 file 修改时间要晚

-name pattern: 基本的文件名(将路径去掉了前面的目录)与shell模式pattern相匹配
-empty: 文件是空的普通文件或者空目录

-type c: 文件是 c 类型的, 可取的值有:
b: 特殊块文件(缓冲的)
c: 特殊字符文件(不缓冲)
d: 目录
p: 命名管道(FIFO)
f: 普通文件
l: 符号链接
s: 套接字

动作 ACTIONS

-exec command: 执行 command
-fls file: 类似 -ls 但是像 -fprint 那样写入 file
-fprint file: 将文件全名打印到文件 file 中
-fprint0 file: 类似 -print0 但是像 -fprint 那样写入 file
-fprintf file format: 类似 -printf 但是像 -fprint 那样写入 file

-print: 打印文件全名,然后是一个换行符, 如果没有动作则默认-print
-print0: 打印文件全名,然后是一个null字符
-printf format: 按照 format 的格式打印,注意-printf不会在字符串末端添加一个新行,如果需要换行的话,在后面加上\n,常用占位符有:

  -n: 新行  
  -r: 回车  
  \t: 水平tab  
  \v: 竖直tab  
  \\: 输出自身'\'  
  %%: 输出自身'%'  
  %a: 文件最后一次存取的时间

  %Ak: 文件最后一次存取的时间,格式以 `k` 指定, `k` 的部分格式如下,全部格式见文末参考连接  
    H: 小时 (00..23)  
    M: 分钟 (00..59)  
    S: 秒 (00..61)  
    T: 24小时格式的时间 (hh:mm:ss)  
    Y: 年份 (1970...)  
    m: 月份 (01..12)  
    d: 一个月当中的日子 (01..31)  
  
  %c: 文件状态最后一次修改的时间
  %Ck: 文件状态最后一次修改的时间。格式以 k 指定,类似于%A
  %f: 去掉了前面的目录的文件名
  %g: 文件的组名
  %h: 文件名的前面的目录部分

  %k: 文件大小,以1kB 的块为单位
  %s: 文件大小,以字节为单位
  
  %p: 文件名
  %P: 文件名,去掉了据以找到了文件的命令行参数的名称部分
  %t: 文件最后一次修改的时间
  %Tk: 文件最后一次修改的时间。格式以 k 指定,类似于%A
  %u: 文件的用户名

参考

linux命令man find
man find

find命令man中文手册
https://manpages.debian.org/unstable/manpages-zh/find.1.zh_CN.html