Linux 更改目录中的文件名

Linux 更改目录中的文件名,linux,bash,shell,Linux,Bash,Shell,我需要将目录中的所有文件名从name.sql更改为tbl_name.sql,例如: city.sql->tbl_city.sql或usr_station.sql->tbl_usr_station.sql 请告诉我为什么下面的代码段不正确 for file in *.sql do echo $file fnew = 'tbl_${file}.sql' eval mv ${file} ${fnew} done 以下步骤应使脚本正常工作: 删除eval并仅使用普通的mv命令(尽可能避免e

我需要将目录中的所有文件名从name.sql更改为tbl_name.sql,例如:

city.sql->tbl_city.sql或usr_station.sql->tbl_usr_station.sql

请告诉我为什么下面的代码段不正确

for file in *.sql
do
  echo $file
  fnew = 'tbl_${file}.sql'
  eval mv ${file} ${fnew}
done

以下步骤应使脚本正常工作:

  • 删除
    eval
    并仅使用普通的
    mv
    命令(尽可能避免
    eval
    ,因为这被认为是一种不好的做法,可能会导致一些严重的安全问题)
  • 删除
    fnew
    =
    和字符串值之间的尾随空格
  • 将引号
    替换为双引号
    ,以便在
    fnew
    赋值表达式中计算
    $file
  • 用于*.sql中的文件
    做
    echo$文件
    fnew=“tbl_${file}”
    mv“$file”“$fnew”
    完成
    
    您可以试试

    for file in *.sql; do mv "$file" tbl_"$file"; done
    

    请注意,在mv目标中没有额外的.sql后缀。它已经包含在$file变量中。

    您不需要
    eval
    命令,只需使用
    mv“$file”$fnew”