免费注册 查看新帖 |

Chinaunix

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

当前目录生成XML文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-17 16:22 |只看该作者 |倒序浏览
10可用积分
朋友让我帮忙写个脚本,输入参数为目录名称,根据里面的内容递归生成XML文件。

比如目录/test的结构如下:

  1. test
  2.     dirA
  3.     dirB
  4.         fileD
  5.     dirC
  6.         fileE
复制代码


那么就得到如下文件:


  1. <test>
  2.     <dirA></dirA>
  3.     <dirB>
  4.         fileD
  5.     </dirB>
  6.     <dirC>
  7.         fileE
  8.     </dirC>
  9. </test>
复制代码


缩进是4个空白字符,XML采用相对路径即可
搞了半天没搞定,谢谢各位先。

最佳答案

查看完整内容

参考了beginner-bj 大侠的贴子,加进了一个缩进控制函数.不过有一个不太好的地方---文件与文件夹没有分成两大类,显示有些混乱.[ 本帖最后由 kvkingdom 于 2009-4-18 01:41 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-17 16:22 |只看该作者
参考了beginner-bj 大侠的贴子,加进了一个缩进控制函数.
不过有一个不太好的地方---文件与文件夹没有分成两大类,显示有些混乱.
  1. #!/bin/bash

  2. dir_to_xml()
  3. {
  4.     local file dir=${1%/}
  5.     local d_format f_format

  6.     ((d_format=${p_count:-0}))
  7.     ((f_format=${p_count:-0}+1))
  8.     [ -d "$dir" ] || return 1
  9.     xml_format $d_format
  10.     echo "<${dir##*/}>"
  11.     for file in $(ls -d ${dir}/* 2>/dev/null)
  12.     do
  13.         if [ -d $file ]
  14.         then
  15.             ((p_count++))
  16.             dir_to_xml $file
  17.             ((p_count--))
  18.         else
  19.             xml_format $f_format
  20.             echo "${file##*/}"
  21.         fi
  22.     done
  23.     xml_format $d_format   
  24.     echo "</${dir##*/}>"
  25.     return 0
  26. }

  27. xml_format()
  28. {
  29.     local count=$1
  30.     [ $count -eq 0 ] && return
  31.     for ((i=0;i<count;i++))
  32.     do
  33.         echo -n "    "
  34.     done
  35. }
  36. dir_to_xml $1
  37. [code][root@localhost xml]# ./xml /boot
  38. <boot>
  39.     config-2.6.18-53.el5
  40.     <grub>
  41.         device.map
  42.         e2fs_stage1_5
  43.         fat_stage1_5
  44.         ffs_stage1_5
  45.         grub.conf
  46.         iso9660_stage1_5
  47.         jfs_stage1_5
  48.         menu.lst
  49.         minix_stage1_5
  50.         reiserfs_stage1_5
  51.         splash.xpm.gz
  52.         stage1
  53.         stage2
  54.         ufs2_stage1_5
  55.         vstafs_stage1_5
  56.         xfs_stage1_5
  57.     </grub>
  58.     initrd-2.6.18-53.el5.img
  59.     <lost+found>
  60.     </lost+found>
  61.     symvers-2.6.18-53.el5.gz
  62.     System.map-2.6.18-53.el5
  63.     vmlinuz-2.6.18-53.el5
  64. </boot>
复制代码

[ 本帖最后由 kvkingdom 于 2009-4-18 01:41 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-04-17 16:27 |只看该作者
有难度,目录结构比较难搞

论坛徽章:
0
4 [报告]
发表于 2009-04-17 16:33 |只看该作者

回复 #2 ywlscpl 的帖子

是阿,倒是有一个ls -R能得到递归目录结构
但是后面好难处理阿!

论坛徽章:
0
5 [报告]
发表于 2009-04-17 16:39 |只看该作者

回复 #3 youshuang 的帖子

恩,但要转换成有规则的数据才利于脚本中的应用

论坛徽章:
0
6 [报告]
发表于 2009-04-17 16:41 |只看该作者

回复 #1 youshuang 的帖子

这个比较难搞,tim做的话问题不大。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2009-04-17 17:00 |只看该作者

回复 #1 youshuang 的帖子

  1. 17:00:43 root@ST-FREE:[/]#cat urfile
  2. test
  3.     dirA
  4.     dirB
  5.         fileD
  6.     dirC
  7.         fileE
  8. 17:00:52 root@ST-FREE:[/]#awk '/^[^ ]/ {level1=$1;print "<"level1">"}
  9. > /^    [^ ]/ {if (level2) print "\t</"level2">";level2=$1;print "\t<"level2">"}
  10. > /^        [^ ]/ {print "\t\t"$1}
  11. > END {print "\t</"level2">\n</"level1">"}' urfile
  12. <test>
  13.         <dirA>
  14.         </dirA>
  15.         <dirB>
  16.                 fileD
  17.         </dirB>
  18.         <dirC>
  19.                 fileE
  20.         </dirC>
  21. </test>
  22. 17:01:07 root@ST-FREE:[/]#
复制代码

论坛徽章:
0
8 [报告]
发表于 2009-04-17 17:02 |只看该作者

回复 #6 beginner-bj 的帖子

佩服!

论坛徽章:
0
9 [报告]
发表于 2009-04-17 17:05 |只看该作者

回复 #6 beginner-bj 的帖子

不过这个urfile是不存在的。怎么构造它?输入只有一个目录名

论坛徽章:
0
10 [报告]
发表于 2009-04-17 17:06 |只看该作者
而且这个目录不一定是两层阿!
要递归处理所有子目录,我只是举个例子。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP