Bash基于XML重命名文件

时间:2015-02-28 08:54:49

标签: xml bash xml-parsing xmllint

我正在制作bash脚本,我需要重命名特定文件类型的所有文件(在本例中为svg),以反映在xml文件中提及它们的顺序。

  

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><manifest identifier="id1" version="2006-01" smartnotebook:filesource="SMART Notebook for Mac Version=11.3.804.0" xmlns="http://www.imsglobal.org/xsd/imscp_v1p1" xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_v1p3" xmlns:smartnotebook="http://www.smarttech.com/2006-01/notebook" xmlns:smartgallery="http://www.smarttech.com/2006-01/gallery"><metadata><schema>ADL SCORM</schema><schemaversion>CAM 1.3</schemaversion><adlcp:location>metadata.xml</adlcp:location></metadata><organizations><organization id="pagegroups"><item id="group0" identifierref="group0_pages"><title>Group 1</title></item></organization></organizations><resources><resource identifier="group0_pages" href="page4.svg" type="webcontent" adlcp:scormType="asset">*******<file href="page4.svg"/><file href="page0.svg"/><file href="page1.svg"/><file href="page3.svg"/><file href="page2.svg"/>********</resource><resource identifier="pages" href="page4.svg" type="webcontent" adlcp:scormType="asset"><file href="page4.svg"/><file href="page0.svg"/><file href="page1.svg"/><file href="page3.svg"/><file href="page2.svg"/></resource><resource identifier="images"/><resource identifier="sounds"/><resource identifier="attachments"/><resource identifier="flash"/><resource identifier="videos"/><resource identifier="annotationmetadata"/><resource identifier="brush"/></resources></manifest>

我需要它来读取此文件(以及相同格式的其他文件)和(例如)将page4.svg重命名为file0.svg ...并将page0.svg重命名为file1.svg。我一直在调查如何通过xmllint执行此操作,但我的xpath知识非常有限。什么都有帮助! 谢谢!

1 个答案:

答案 0 :(得分:0)

xpath查询//resource/file/@href将为您提供href列表。但是基于xml样本会有重复。如果您只想要第一个资源中的列表,可以使用//resource[1]/file/@href或者使用标识符//resource[@identifier="group0_pages"]/file/@href指定。

但是,出于某种原因,我无法让xmllint接受这些查询,即使它们是正确的,并且它们可以在其他工具中使用。相反,在Linux中,我使用xpath实用程序,它是libxml-xpath-perl包中的perl脚本。除了一些简单的解析之外,一个示例bash脚本如下所示:

i=0
while read filename; do
        mv $filename file$i.svg
        let i++
done < <(xpath -q -e '//resource[@identifier="group0_pages"]/file/@href' input.xml | cut -d\" -f2)