我有一个XML文件目录。每个文件都有自己的唯一标识符。每个文件还包含一个或多个对其他文件的引用(在单独的目录中),它们也具有唯一的ID。
例如,我有一个名为example01.xml
的文件:
<file>
<fileId>xyz123</fileId>
<fileContents>Blah blah Blah</fileContents>
<relatedFiles>
<otherFile href='http://sub.domain.abc.edu/directory/index.php?p=collections/pageview&id=1234'>
<title>Some resource</title>
</otherFile>
<otherFile href='http://sub.domain.abc.edu/directory/index.php?p=collections/pageview&id=4321'>
<title>Some other resource</title>
</otherFile>
</relatedFiles>
</file>
如果一个文件有多个relatedFiles/otherFile
个元素,我需要为每个@href
创建一个文件副本并重命名,并将@href
中唯一ID的值与值fileID
。因此,例如,我需要创建文件example01.xml
的两个副本,一个名为abc01_xyz123.xml
,另一个名为abc0002_xyz123.xml
。这应该扩展为创建与otherFile
元素一样多的副本。
现在,我有一个bash脚本可以执行此操作,如果只有一个otherFile
元素,但我的脚本技能有限,我无法确定如何处理多个otherFile
元素
#!/bin/bash
for f in *.xml;
do
name=`xpath -e 'string(//otherFile/@href)' $f 2> /dev/null`
echo "Moving" $f "to" ${name:3}.xml
echo $name
mv $f ${name:3}.xml
done
提前致谢。
答案 0 :(得分:1)
这样的事可能有用:
#!/bin/bash
for f in *.xml; do
fid=$(xpath -e '//fileId/text()' "$f" 2>/dev/null)
for uid in $(xpath -e '//otherFile/@href' "$f" 2>/dev/null | awk -F= '{gsub(/"/,"",$0); print $3}'); do
echo "Moving $f to ${fid}_${uid}.xml"
cp "$f" "${fid}_${uid}.xml"
done
rm "$f"
done