我有一个名为 *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
小心!您在命令中使用 * 通配符。如果您的目录中有多个 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
那么您的典型批次名称是什么,其中的任何空格。如果是这样,您可能需要在文件名的第二位周围放置语音标记。值得 echo $ batch_name aldo 你可以尝试 load_$(echo $ $batch_name)_set.xml
例如,您可以使用这个单行脚本:
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 $