我有一个名为* 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
答案 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 $