ksh将用户输入前缀的多个文件重命名为用户

时间:2017-02-28 02:48:01

标签: rename ksh prefix

脚本编写新手......

假设我在当前目录中有多个带有多个前缀的文件。我需要根据用户输入重命名它们。 假设我有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

1 个答案:

答案 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