我有一些文件,例如:
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 使用的不同常用表达元字符的语法和含义。