脚本编写新手......
假设我在当前目录中有多个带有多个前缀的文件。我需要根据用户输入重命名它们。 假设我有aaa_file.dat和bbb_file.dat aaa_log.dat ccc.txt等等。
脚本将要求输入“旧前缀”并输入“新前缀”并搜索带有“旧”前缀的文件,并将其命名为“new”前缀。
print "enter old prefix" ;
read old ;
print "enter new prefix" ;
read new ;
查找并重命名部分是我卡住的地方..
for $old in * ;
do mv $old_* $new_* ;
done
如果我输入用户aaa和zzz我的文件,我的结果应该是: aaa_file.dat和aaa_log.dat现在命名为zzz_file.dat zzz_log.dat
答案 0 :(得分:0)
你有一些错误
for $old in * ;
do
mv $old_* $new_* ;
done
使用for循环时,将为循环变量赋值。请将$
放入for $old in *
您已经为变量old
分配了一个值,您不希望用新值覆盖它。使用像for file in *
(或for file in ${old}*
)这样的新变量。
变量的名称可以包含下面的内容。 $old_*
与${old}_*
不同。习惯在所有情况下使用这些大括号,除了一个字符变量,后面跟一个空格或引号
当你写${new}_*
时,你希望有一些魔力。该变量将扩展为其值(如zzz),shell将搜索以zzz_
(未找到)开头的文件,并将尝试(当您编写mv ${old}_* ${new}_*
时)以其名称移动所有文件从aaa_开始到名为zzz_*
的目录
因此,使用sed
:
必须使用旧文件名构造新文件名。
for file in ${old}_*; do
newfile=$(echo "${file}"| sed "s/^${old}_/${new}_/")
# Remove the word echo when the command shows the mv commands you like
echo mv "${file}" "${newfile}"
done