根据其内容重命名文件

时间:2018-03-16 15:35:33

标签: bash batch-file

我希望有人可以帮我解决命令或批处理文件?

我有很多文件,里面有一些元信息。

我正在尝试读取特定行并从其某些内容重命名该文件。

这是内容的一个例子,

<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

谢谢, 斯图尔特

2 个答案:

答案 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