在linux中重命名文件

xmd2e60i  于 2023-06-29  发布在  Linux
关注(0)|答案(2)|浏览(161)

我有文件格式:

schema_tableName_1.sql
schema_tableName_2.sql
schema_tableName_3.sql
...

如何重命名文件,使格式看起来像这样:

tableName_1.sql
tableName_2.sql
tableName_3.sql
...

这些文件应保留在同一目录中。我试过:

mv "*schema_tableName*"  tableName_*
yx2lnoni

yx2lnoni1#

我试过:

mv "*schema_tableName*"  tableName_*

这条线沿着的任何东西都不可能奏效。
首先,请注意"*schema_tableName*"周围的引号抑制了其内容的路径名扩展。也就是说,它们导致星号(*)被视为普通字符。一般来说,负责解释模式的是shell,而不是它执行的命令,因此将这些文件名传递给mv对您没有任何用处。
其次,如果各种目标文件不存在,那么tableName_*将根据shell选项的当前值展开为自身或不展开,但这两种方法对您都没有用。
第三,假设您实际上拥有命令

mv schema_tableName_1.sql schema_tableName_2.sql schema_tableName_3.sql \
          tableName_1.sql        tableName_2.sql        tableName_3.sql

mv schema_tableName_1.sql tableName_1.sql \
   schema_tableName_2.sql tableName_2.sql \
   schema_tableName_3.sql tableName_3.sql

或者能扩展成其中一个的东西。看起来你是在做类似的事情,但是mv并没有做你想做的事情。它不执行成对移动,除非只给出一对非选项参数。当有两个以上的非选项参数提供给它时,最后一个参数必须命名一个目录,所有其他参数命名的文件将被移动到该目录中。
要执行成对移动,需要为每一对使用mv命令。一个shell for循环似乎很自然。您需要以某种方式从源文件名生成目标文件名。壳具有非常适合于此的转换参数扩展选项。总体:

for f in schema_tableName_*.sql; do
  mv "${f}" "${f#schema_}"
done

这将展开glob schema_tableName_*.sql,并依次为每个结果文件名设置shell变量f为文件名,并执行dodone之间的命令。"${f#schema_}"扩展为变量f的值,并删除前缀“schema_”(如果存在)。这就为您提供了所需的成对mv命令。
此外,由于标记了Linux,因此可以考虑使用rename命令。这可能会基于字符串替换执行许多文件重命名,因此它可以提供稍微简单的命令,但它是特定于Linux的:

rename schema_ '' schema_tableName_*.sql

我通常建议使用标准命令,如mv,而不是特定于平台的命令,如rename,因为这会开发更广泛可重用的技能(例如MacOS),但YMMV。

  • 或者您可以通过-t选项指定一个目标目录,但在任何情况下目标都必须是一个目录。
svdrlsy4

svdrlsy42#

你试过rename批量重命名linux命令吗?
或者你可以创建一个bash脚本,循环一个giver模式并替换为另一个模式,比如:

orig=schema_tableName_
dest=tableName_

for(i=0; i<(ls ${orig}*|wc -l); i++) {
  cp ${orig} ${dest} -v
}

还有其他选择:https://www.makeuseof.com/batch-rename-files-in-linux/

相关问题