在Linux中如何重命名一个目录中的多个文件并保留扩展名

在Linux中如何重命名一个目录中的多个文件并保留扩展名,linux,bash,Linux,Bash,我需要重命名目录中的文件,去掉一个字符串,每个文件都有不同的字符,但启动方式相同。我知道如何从文件名中删除字符,但如何保留扩展名?我知道这是一个普通问题的变体,但我找不到一个符合我确切需要的答案 Redshirts_ep6_dSBHpCsvQ3BfQ7-NNIjXYO4pnHpNMvu7bfvURLF3BSzB_3YOOrBBoNnICTR-hg.mp3 -> Redshirts.mp3 PathsNotTaken_ep6_XWixFER4PJyeozVfcxT96UajpnVI7cRMR

我需要重命名目录中的文件,去掉一个字符串,每个文件都有不同的字符,但启动方式相同。我知道如何从文件名中删除字符,但如何保留扩展名?我知道这是一个普通问题的变体,但我找不到一个符合我确切需要的答案

Redshirts_ep6_dSBHpCsvQ3BfQ7-NNIjXYO4pnHpNMvu7bfvURLF3BSzB_3YOOrBBoNnICTR-hg.mp3
-> Redshirts.mp3
PathsNotTaken_ep6_XWixFER4PJyeozVfcxT96UajpnVI7cRMRhAU4Aj9-rpeacnBleuGY9zCPDe0aQ.mp3
-> PathsNotTaken.mp3

linux命令
rename
在这里非常有用。它可以使用正则表达式执行重命名

这可能会被重写一点,但它似乎与此处的作业有关:

rename -n 's/(^[^_]*)_.*/$1.mp3/' *.mp3
只需删除要真正运行的
-n
标志。开着它只是一个测试

这个正则表达式说:


如果行开始处的字符不包含下划线
[^.]
且重复次数不超过
*
的,则将其捕获到捕获组
(^[^.]*)
,前提是这些字符后跟下划线和任何数量的任何其他字符
.*
。然后使用第一个捕获组
$1
,然后再使用
.mp3

重写它们,因此您希望删除第一个
\uu
及其后的所有内容,直到第一个
,这是正确的。
mv$file${file/\u*/}
为什么不简单地
重命名's/.*/.mp3/'*.mp3
?值得注意的是,这需要在基于Debian的发行版中找到的
重命名
的Perl实现。其他发行版默认使用util linux
rename
工具,但该工具不起作用。