在Shell中动态重命名XML文件

时间:2013-03-14 08:02:16

标签: linux shell unix dynamic rename

我有一个名为* dmi_standard_load_B0001_set.xml *的XML文件,我想通过从用户接受* batch_name *并将其更改为* dmi_standard_load _ $ {batch_name} _set.xml *来动态重命名。

我该怎么做?我尝试了以下命令,它抛出错误并且不起作用......

 mv dmi_standard_load_*_set.xml dmi_standard_load_${batch_name}_set.xml

3 个答案:

答案 0 :(得分:1)

那么你的典型批名是什么空间。如果是这样,您可能需要在文件名周围加上第二位的语音标记。值得回复$ batch_name aldo你可以尝试加载_ $(echo $ $ batch_name)_set.xml

答案 1 :(得分:1)

小心!您在命令中使用*通配符。如果目录中有多个XML文件,例如:

dmi_standard_load_B0001_set.xml
dmi_standard_load_B0002_set.xml
dmi_standard_load_B0003_set.xml

您的命令将扩展为:

mv dmi_standard_load_B0001_set.xml dmi_standard_load_B0002_set.xml dmi_standard_load_B0003_set.xml dmi_standard_load_${batch_name}_set.xml

并且很可能会失败,告诉你最后一个参数不是目录。所以首先,你想循环遍历你的文件,如下所示:

for f in dmi_standard_load_*_set.xml
do
    mv ${f} dmi_standard_load_${batch_name}_set.xml
done

不要运行那个代码!我们还没完成。这里的问题是你要将每个XML文件重命名为一个且只有一个文件。实际上,您最终会得到一个名为dmi_standard_load_${batch_name}_set.xml的文件,其中包含经过循环的最后一个XML文件的内容。

您希望用户为每个文件指定不同的批处理名称,对吗?因此,您需要使用read命令向她询问循环中的每个文件:

for f in dmi_standard_load_*_set.xml
do
    echo Please enter a batch name for file $f :
    read batch_name
    mv ${f} dmi_standard_load_${batch_name}_set.xml
done

这样可以,但没有错误检查...用户可以按Enter键,给出一个空的批名称。这是一个确保用户提供名称的最终版本:

for f in dmi_standard_load_*_set.xml
do
    batch_name=
    while [[ ${batch_name} == '' ]]
    do
        echo Please enter a batch name for file $f :
        read batch_name
    done
    mv ${f} dmi_standard_load_${batch_name}_set.xml
done

答案 2 :(得分:1)

例如,您可以使用此单行脚本:

for file_name in *; do echo -ne "Renaming file \"${file_name}\" Enter batch_name: "; read batch_name; mv "${file_name}" "dmi_standard_load_${batch_name}_set.xml"; done

这是我的gentoo框中的示例:

user@host ~/test $ ls -1
dmi_standard_load_B0001_set.xml
dmi_standard_load_B0002_set.xml
dmi_standard_load_B0003_set.xml
dmi_standard_load_B0004_set.xml
dmi_standard_load_B0005_set.xml
user@host ~/test $ for file_name in *; do echo -ne "Renaming file \"${file_name}\" Enter batch_name: "; read batch_name; mv "${file_name}" "dmi_standard_load_${batch_name}_set.xml"; done
Renaming file "dmi_standard_load_B0001_set.xml" Enter batch_name: test
Renaming file "dmi_standard_load_B0002_set.xml" Enter batch_name: another test
Renaming file "dmi_standard_load_B0003_set.xml" Enter batch_name: and test again
Renaming file "dmi_standard_load_B0004_set.xml" Enter batch_name: four
Renaming file "dmi_standard_load_B0005_set.xml" Enter batch_name: last, five
user@host ~/test $ ls -1
dmi_standard_load_and test again_set.xml
dmi_standard_load_another test_set.xml
dmi_standard_load_four_set.xml
dmi_standard_load_last, five_set.xml
dmi_standard_load_test_set.xml
user@host ~/test $