为什么重命名命令不能按预期工作?

为什么重命名命令不能按预期工作?

我有一些文件,例如:

1_suffix.txt
2_suffix.txt
3_suffix.txt

我想删除_suffix.txt其中的。我找到了一个名为的命令rename并将其用作:

首先我尝试:

rename -v 's/*_suffix.txt$/\.txt/' *.png

它不起作用,但后来我尝试了:

rename -v 's/_suffix.txt$/\.txt/' *.png

有效。

我认为第二个正则表达式不正确,但为什么它有效?

我尝试使用 ls:

ls _suffix.txt # not worked
ls *_suffix.txt # worked

答案1

rename命令采用正则表达式,而不是全局模式。虽然*foo是有效的全局模式,但它不是有效的正则表达式。意思*是“0个或多个”,但您还需要指定0个或多个什么。对于“任何字符”,请使用.

s/.*_suffix\.txt$/.txt/

现在,下一个问题是这s/_suffix.txt$/\.txt/' *.png永远行不通。您告诉它rename重命名所有名称以 . 结尾的文件,_suffix.txt但告诉它对名称以 . 结尾的文件执行此操作png。这就是 the *png(它是一个 glob 而不是正则表达式)的含义。

我想你真正想要的是:

rename 's/_suffix//' *suffix.txt

这将不会替换_suffix任何内容,只会将其删除,这将为您的文件提供您想要的名称。

答案2

路径名 glob 模式Unix shell 使用的不同常用表达元字符的语法和含义。

相关内容