我有文件格式:
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_*
yx2lnoni1#
我试过:
这条线沿着的任何东西都不可能奏效。首先,请注意"*schema_tableName*"周围的引号抑制了其内容的路径名扩展。也就是说,它们导致星号(*)被视为普通字符。一般来说,负责解释模式的是shell,而不是它执行的命令,因此将这些文件名传递给mv对您没有任何用处。其次,如果各种目标文件不存在,那么tableName_*将根据shell选项的当前值展开为自身或不展开,但这两种方法对您都没有用。第三,假设您实际上拥有命令
"*schema_tableName*"
*
mv
tableName_*
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
for f in schema_tableName_*.sql; do mv "${f}" "${f#schema_}" done
这将展开glob schema_tableName_*.sql,并依次为每个结果文件名设置shell变量f为文件名,并执行do和done之间的命令。"${f#schema_}"扩展为变量f的值,并删除前缀“schema_”(如果存在)。这就为您提供了所需的成对mv命令。此外,由于标记了Linux,因此可以考虑使用rename命令。这可能会基于字符串替换执行许多文件重命名,因此它可以提供稍微简单的命令,但它是特定于Linux的:
schema_tableName_*.sql
f
do
done
"${f#schema_}"
rename
rename schema_ '' schema_tableName_*.sql
我通常建议使用标准命令,如mv,而不是特定于平台的命令,如rename,因为这会开发更广泛可重用的技能(例如MacOS),但YMMV。
-t
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/
2条答案
按热度按时间yx2lnoni1#
我试过:
这条线沿着的任何东西都不可能奏效。
首先,请注意
"*schema_tableName*"
周围的引号抑制了其内容的路径名扩展。也就是说,它们导致星号(*
)被视为普通字符。一般来说,负责解释模式的是shell,而不是它执行的命令,因此将这些文件名传递给mv
对您没有任何用处。其次,如果各种目标文件不存在,那么
tableName_*
将根据shell选项的当前值展开为自身或不展开,但这两种方法对您都没有用。第三,假设您实际上拥有命令
或
或者能扩展成其中一个的东西。看起来你是在做类似的事情,但是
mv
并没有做你想做的事情。它不执行成对移动,除非只给出一对非选项参数。当有两个以上的非选项参数提供给它时,最后一个参数必须命名一个目录,所有其他参数命名的文件将被移动到该目录中。要执行成对移动,需要为每一对使用
mv
命令。一个shellfor
循环似乎很自然。您需要以某种方式从源文件名生成目标文件名。壳具有非常适合于此的转换参数扩展选项。总体:这将展开glob
schema_tableName_*.sql
,并依次为每个结果文件名设置shell变量f
为文件名,并执行do
和done
之间的命令。"${f#schema_}"
扩展为变量f
的值,并删除前缀“schema_”(如果存在)。这就为您提供了所需的成对mv
命令。此外,由于标记了Linux,因此可以考虑使用
rename
命令。这可能会基于字符串替换执行许多文件重命名,因此它可以提供稍微简单的命令,但它是特定于Linux的:我通常建议使用标准命令,如
mv
,而不是特定于平台的命令,如rename
,因为这会开发更广泛可重用的技能(例如MacOS),但YMMV。-t
选项指定一个目标目录,但在任何情况下目标都必须是一个目录。svdrlsy42#
你试过
rename
批量重命名linux命令吗?或者你可以创建一个bash脚本,循环一个giver模式并替换为另一个模式,比如:
还有其他选择:https://www.makeuseof.com/batch-rename-files-in-linux/