KSH重命名了用户输入的多个具有前缀的多个文件,请通过用户输入的另一个前缀



脚本很新...

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

您在

中有一些错误
for $old in * ;
do 
   mv $old_* $new_* ;
done

使用循环时,将分配一个值为循环变量。因此,将$放在for $old in *中。
您已经为变量old分配了一个值,您不想用新值覆盖它。使用诸如for file in *(或for file in ${old}*)之类的新变量。变量可以以其名称下意。$old_*${old}_*不同。在所有情况下都习惯于使用这些牙套,除了一个字符变量后有空间或引用。
当您编写${new}_*时,您希望有一些魔术。该变量将扩展到其值(例如zzz),外壳以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

最新更新