查看子文件夹中的文件个数及find命令解析
查看子文件夹中的文件个数
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
-delete: 删除查找到的文件
-exec command ; 或 -exec command \; : 执行 command命令,这个命令的解析直到;结束,在有些find的版本中,可能需要用\进行转义,即\;,在command命令中,可以用占位符{}表示用前面find找到的文件
-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: 文件的用户名
示例
查看子文件夹中的文件个数
find /home/test -type f -printf '%h\n' | sort | uniq -c
删除修改时间是7天前的以.log结尾的文件
find /home/test -type f -name *.log -mtime +7 -exec rm {} \;
或
find /home/test -type f -name *.log -mtime +7 -delete
或
find /home/test -type f -name *.log -mtime +7 | xargs rm -f
参考
linux 命令 man find
Linux系统find命令详解
https://zhuanlan.zhihu.com/p/556919811?utm_id=0
find命令man英语手册
https://manned.org/man/find.1
find命令man中文手册
https://manned.org/man.zh_CN/find.1
相比于英语手册,这个中文手册里面有一些缺失, 比如里面缺少-delete的说明,对应的英文文档中是有的
也有一些翻译不太准确的地方, 比如-amin n,英文版说明是File was last accessed less than, more than or exactly n minutes ago., 中文翻译为对文件的最近一次访问是在 n 分钟之前。,把less than和exactly的意思给省略了,英文版说明就和前面的+n、-n和n的解释对应上了

浙公网安备 33010602011771号