免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2238 | 回复: 5
打印 上一主题 下一主题

目录统计的脚本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-28 16:47 |只看该作者 |倒序浏览
大家帮帮忙,我现在要写个脚本,根据一个文件统计目录个数。文件的内容是我find -type d跑出来的。格式为
/mnt/f3020/admintool/resources/photos
/mnt/f3020/admintool/resources/photos/cn
/mnt/f3020/admintool/resources/photos/cn/ji
/mnt/f3020/admintool/resources/photos/cn/ji/cnjinlidadz
/mnt/f3020/admintool/resources/photos/cn/ji/cnjinchangcheng
/mnt/f3020/admintool/resources/photos/cn/ji/cnjinben
/mnt/f3020/admintool/resources/photos/cn/ji/cnjimex
/mnt/f3020/admintool/resources/photos/cn/ji/cnjingyou
/mnt/f3020/admintool/resources/photos/cn/ji/cnjingyou/tmp
/mnt/f3020/admintool/resources/photos/cn/ji/cnjialiya
/mnt/f3020/admintool/resources/photos/cn/ji/cnjinluda
/mnt/f3020/admintool/resources/photos/cn/ji/cnjinluda/tmp


我想在就是想统计/mnt/f3020/admintool/resources/photos下面每一个目录的子目录个数,该怎么写呢?
统计结果要这样:
/mnt/f3020/admintool/resources/photos 4表示这个目录下面有4个子目录
/mnt/f3020/admintool/resources/photos/cn 12表示这个目录下面有12个子目录
/mnt/f3020/admintool/resources/photos/us 20表示这个目录下面有20个子目录

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
2 [报告]
发表于 2008-01-28 17:13 |只看该作者
try:

  1. awk 'BEGIN{FS=OFS="/"}{$NF="";a[$0]++}END{for(i in a) print i" "a[i]}' urfile
复制代码

论坛徽章:
0
3 [报告]
发表于 2008-01-28 17:25 |只看该作者

  1. awk '
  2. BEGIN{FS=OFS="/"}
  3. NF>6 && NF<9{NF--;a[$0]++}
  4. END{for(d in a)print d"\t"a[d]}' 目录文件 | sort -t '/' -k7
复制代码


解释:
FS=OFS="/"  以/作为字段分解字符,为了保持原样,因此OFS也设置为"/"
通过分析,需要获取的有效目录的深度为6和7,而因为行首也为/,因此,在awk中分解后的目录深度就是7和8
当去掉最后一个目录的时候,就可以分别统计
/mnt/f3020/admintool/resources/photos
及其下一级子目录中的各个子目录的个数。
所以:
NF>6&&NF<9{...}
NF--;a[$0]++ 就可以分别统计了
END{for(d in a)print d"\t"a[d]} 分析完目录文件后,打印结果
sort -t '/' -k7 最后对结果排序,因为awk输出的结果是乱序,因此需要重新按照目录名进行排序。

用下面的代码可以不需要目录文件,直接用find就可以统计了,需要在bash中运行

  1. find /mnt/f3020/admintool/resources/photos -maxdepth 1 -type d | while read dir
  2. do
  3.    dirs=$(find "$dir" -maxdepth 1 -type d | wc -l)
  4.    echo $dir  $((dirs-1))
  5. done
复制代码

论坛徽章:
0
4 [报告]
发表于 2008-01-28 20:26 |只看该作者
原帖由 ly5066113 于 2008-1-28 17:13 发表
try:

awk 'BEGIN{FS=OFS="/"}{$NF="";a[$0]++}END{for(i in a) print i" "a}' urfile



这个方法经典,先将最后一位置空再统计
ly兄是shell的高人,都是高人啊

论坛徽章:
0
5 [报告]
发表于 2008-01-29 10:47 |只看该作者
原帖由 ly5066113 于 2008-1-28 17:13 发表
try:

awk 'BEGIN{FS=OFS="/"}{$NF="";a[$0]++}END{for(i in a) print i" "a}' urfile


的确很经典啊

论坛徽章:
0
6 [报告]
发表于 2008-01-29 16:04 |只看该作者
果然是非常经典的语句噶~~
顶大侠~~

awk真的是要当作一门语言来学习。。
我根本就不会去想在awk里嵌套数组和循环

[ 本帖最后由 qqeyes 于 2008-1-29 16:06 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP