0

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

我怎样才能做到这一点 ?我尝试了以下命令 bt 它会引发错误并且不起作用...

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

3 回答 3

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
于 2013-03-14T09:11:10.443 回答
1

那么您的典型批次名称是什么,其中的任何空格。如果是这样,您可能需要在文件名的第二位周围放置语音标记。值得 echo $ batch_name aldo 你可以尝试 load_$(echo $ $batch_name)_set.xml

于 2013-03-14T08:25:42.303 回答
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 $
于 2013-03-14T09:30:36.200 回答