免费注册 查看新帖 |

Chinaunix

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

文件夹批量逐级授权问题的(已解决,感谢CUer: crisman,damofeixue,ivhb) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-13 15:33 |只看该作者 |倒序浏览
(问题已解决!)

现有文件夹,目录结构如下:

/tmp/test
/tmp/test/1/1/1/1/1/1/1/1/1/1/1
/tmp/test/1/2/2/2/2/2/2//2/2/2/2
/tmp/test/2/1/1/1/1/1//1/1/1/1/1
/tmp/test/2/3/3/3/3/3/3/3/3/3/3/3
/tmp/test/3/4/4/4/4/4/4/4/4/4/4/4
/tmp/test/3/5/5/5/5/5/5/5/5/5/5/5

现要求写一个shell程序,对如上目录逐级授权(chmod 755) ,也就是说先进test目录,对1,2,3目录授权,然后再进1的子目录,对1,2授权,以此类推,1级目录授权完毕后,再进2级目录授权。一个分支授权完毕后进入另外一个目录分支授权。

ps : 因为每一级目录下都有几千万的文件,我不需要对文件操作,只需要对文件夹操作,以减轻操作量。

目前,我只实现了授权完一个目录分支,就退出来了,代码如下:


  1. #!/bin/bash
  2. # site: Chinaunix  Author: echo52
  3. # name: chmodfile

  4. PATH=$PATH:/bin:/sbin:/usr/bin:/usr/local/bin

  5. DIRPATH1=`find $1 -maxdepth 1 -type d|sed '1d'`
  6. DIRNUM=1

  7. # 授权 初始 目录
  8. chmod 755 $DIRPATH1
  9. #echo "$DIRPATH1"


  10. until  [ $DIRNUM = 0 ]
  11.   do
  12.    
  13.     for a in $DIRPATH1
  14.       do
  15.          A_DIRPATH=`echo $a`
  16.          
  17.          echo "授权路路径  $A_DIRPATH"
  18.          chmod 755 $A_DIRPATH
  19.             
  20.          DIRPATH1=`find $A_DIRPATH -maxdepth 1 -type d|sed '1d'`
  21.          DIRNUM=`find $A_DIRPATH -maxdepth 1 -type d|sed '1d'|wc -l`
  22.       done
  23.    done

复制代码


执行结果如下:

  1. [root@test  tmp]# ./chmodfile ./
  2. 授权路路径  ./test
  3. 授权路路径  ./test/2
  4. 授权路路径  ./test/1
  5. 授权路路径  ./test/3
  6. 授权路路径  ./test/3/4
  7. 授权路路径  ./test/3/5
  8. 授权路路径  ./test/3/5/5
  9. 授权路路径  ./test/3/5/5/5
  10. 授权路路径  ./test/3/5/5/5/5
  11. 授权路路径  ./test/3/5/5/5/5/5
  12. 授权路路径  ./test/3/5/5/5/5/5/5
  13. 授权路路径  ./test/3/5/5/5/5/5/5/5
  14. 授权路路径  ./test/3/5/5/5/5/5/5/5/5
  15. 授权路路径  ./test/3/5/5/5/5/5/5/5/5/5
  16. 授权路路径  ./test/3/5/5/5/5/5/5/5/5/5/5
  17. 授权路路径  ./test/3/5/5/5/5/5/5/5/5/5/5/5
复制代码


可以看到只是  ./test/3/5/5/5/5/5/5/5/5/5/5/5 完全完成了,DIRNUM 为0了,循环退出。


总结一下楼下各位的建议,这个问题的通用性比较好的解决方法如下:



  1. #!/bin/bash
  2. # site: Chinaunix  
  3. # Author: crisman,damofeixue,ivhb,echo52
  4. # name: chmodfile
  5. # 如若转载,引用, 请保留以上信息

  6. if [ $# -ne 2 ]
  7.   then
  8.     echo "  "
  9.     echo " usage:  chmodfile DIR NUM"
  10.     echo " DIR 为需要授权的起始目录 NUM为需要授权的目录级数(为正的整数)"
  11.     echo " 例如: ./chmodfile ./  5
  12.     echo "  "
  13.     exit 1
  14. fi

  15. for i in `seq 1 $2`
  16.   do
  17.    find $1 -mindepth $i -maxdepth $i -type d |xargs chmod 755
  18. done

复制代码


感谢crisman,damofeixue,ivhb   特此结贴!

[ 本帖最后由 echo52 于 2009-7-14 16:33 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-07-13 15:35 |只看该作者
授权是啥意思 chown吗?

论坛徽章:
0
3 [报告]
发表于 2009-07-13 15:36 |只看该作者
chown?还是chmod?
都有-R参数,何苦这样呢?

论坛徽章:
0
4 [报告]
发表于 2009-07-13 15:38 |只看该作者
除非想每一级都不同

论坛徽章:
0
5 [报告]
发表于 2009-07-13 15:39 |只看该作者
当每一个目录都有上亿的文件的时候。一个find可能导致内存耗尽,一个-R 可能一个月都完成不了。
而如果分级进行的话可能会快很多。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
6 [报告]
发表于 2009-07-13 15:46 |只看该作者

回复 #5 echo52 的帖子

没有这么夸张吧。

论坛徽章:
0
7 [报告]
发表于 2009-07-13 15:52 |只看该作者

回复 #5 echo52 的帖子

无论如何都是更改 indoe 中的信息,最终还会具体到每个文件, chown -R不ok吗?

论坛徽章:
0
8 [报告]
发表于 2009-07-13 15:53 |只看该作者
目录量也很大吗?这样会有问题吗?

  1. find /tmp/test -type d -exec chmod 755 {} \;
复制代码

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
9 [报告]
发表于 2009-07-13 15:54 |只看该作者
把find都搞残了,估计难办。

论坛徽章:
0
10 [报告]
发表于 2009-07-13 16:03 |只看该作者
原帖由 kwokcn 于 2009-7-13 15:53 发表
目录量也很大吗?这样会有问题吗?

find /tmp/test -type d -exec chmod 755 {} \;


目录量也很大,我试过,只是一个find ./ -type d  就导致服务器无响应,只能硬关机,所以只能分步逐级进行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP