我希望有人可以帮我解决命令或批处理文件?
我有很多文件,里面有一些元信息。
我正在尝试读取特定行并从其某些内容重命名该文件。
这是内容的一个例子,
<recording>
<file name="currentfilename.wav">
<fixedtags>
<tenant value="default" />
<campaignname value="1864" />
<agentid value="600+1+488295" />
<sessionid value="" />
<telephonenumber value="99999" />
<diallednumber value="" />
<agentrecordedoutcome value="0" />
<telephonyoutcome value="10" />
<committment value="0" />
<successrating value="0" />
<callstarttime value="43174.629577" />
<calllength value="16762" />
<date value="2018-03-15" />
<sessionGUID value="" />
<EndpointGuid value="" />
<SessionUniqueId value="" />
<Direction value="Outbound" />
</fixedtags>
<customtags>
<tagone value="" />
<tagtwo value="" />
<tagthree value="" />
<tagfour value="" />
<tagfive value="" />
<tagsix value="" />
</customtags>
<hash></hash>
</file>
</recording>
这是尝试放在一起的输出
例如,文件中的每个名称都来自文件中的内容。
campaignname-telephonenumber-date-callstarttime-agentid-Direction.txt
所以输出看起来像这样
1864-99999-20180315-43174.629577-600+1+488295-Outbound.txt
谢谢, 斯图尔特
答案 0 :(得分:0)
最简单的方法是使用XSLT,假设您的文件是常规的。以下将获取您的XML并返回文件名...
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org">
<xsl:template match="/recording/file/fixedtags">
<xsl:value-of select="campaignname/@value"/>-<xsl:value-of select="telephonenumber/@value"/>-<xsl:value-of select="date/@value"/>-<xsl:value-of select="callstarttime/@value"/>-<xsl:value-of select="agentid/@value"/>-<xsl:value-of select="Direction/@value"/>.txt
</xsl:template>
</xsl:stylesheet>
如果你在Bash,那么xsltproc。如果使用PowerShell,则使用本机.NET 库甚至调用可执行文件。您可能仍需要清理名称,以防XML包含不符合文件名的内容!可能快速的包装功能使所有这些都可以轻松重复使用。
从那里,循环浏览文件并进行重命名。
答案 1 :(得分:0)
XML纯粹主义者不喜欢这个脚本,但它很简单,花了我5分钟的时间。
对于OP,一旦你满意它就会做你想要的,删除最后一行的echo " "
,这样就执行命令而不是打印出来。
还可以调整/bin/ls *.xml
命令以仅处理所需的文件,或者它们是否在另一个目录中。
假设:标签不会在唯一的XML文件中重复,格式不会更改(<tag> value="SOMEVALUE" \>
)
剧本:
#! /bin/bash
#
for FILE in $(/bin/ls *.xml)
do
campaingname=$(grep campaignname $FILE | cut -d'"' -f2)
telephonenumber=$(grep telephonenumber $FILE | cut -d'"' -f2)
thedate=$(grep "date" $FILE | cut -d'"' -f2)
callstarttime=$(grep callstarttime $FILE | cut -d'"' -f2)
agentid=$(grep agentid $FILE | cut -d'"' -f2)
Direction=$(grep Direction $FILE | cut -d'"' -f2)
echo "mv $FILE $campaingname-$telephonenumber-$thedate-$callstarttime-$agentid-$Direction.txt"
done