重命名命令,用于从某个点(字符)替换文件名中的文本,但仅限于并保持文件扩展名

rename command for replacing text in filename from a certain point (character), but only up to, and maintaining the file extension

我有很多文件如下

audiofile_drums_1-ktpcwybsh5c.wav
soundsample_drums_2-fghlkjy57sa.wav
noise_snippet_guitar_5-mxjtgqta3o1.wav
louder_flute_9-mdlsiqpfj6c.wav

我想删除“-”和 .wav 文件扩展名之间的所有内容(包括“-”),留下

audiofile_drums_1.wav
soundsample_drums_2.wav
noise_snippet_guitar_5.wav
louder_flute_9.wav

我尝试使用

删除字符“-”之后的所有内容,包括字符“-”
rename 's/-.*//' *

这给了我

audiofile_drums_1
soundsample_drums_2
noise_snippet_guitar_5
louder_flute_9

并且由于找不到一种简单的方法来再次重命名所有文件,添加 .wav 扩展名,我希望有一种更灵活的方法可以在一个阶段而不是 2 个阶段中用一个漂亮的命令来做到这一点。

有什么建议吗?

谢谢

您可以使用rename 's/-[^\.]*\.wav$/\.wav/' *

第一部分 -[^\.]*\.wav$ 搜索 - 后跟 n 个不是 . 的字符,后跟 .wav 和文件名结尾。文件名结尾和 .wav 不是严格需要的,但它有助于避免重命名您不想重命名的文件。

/\.wav/ 保留扩展名。

请注意 rename 不是标准实用程序,它是 perl 的一部分,因此 rename 可能无法在每个 linux 系统上使用。

这适用于我的特定情况,但应该适用于任何文件扩展名。

rename -n 's/-.*(?=\.wav$)//' *

该命令查找文件名中 - 符号之后和包含的所有字符,然后使用正向先行** (?=\.wav$) 搜索字符(此文件扩展名case) 在文件名的末尾(由 $ 表示,并用无字符替换它们(删除它们)。

** 注意: 正面展望是零宽度断言。 会影响比赛但不会被收录 在更换。 ('.wav' 部分不会 擦除)

在此示例中,(?=\.wav$) 是正向预测。与正则表达式一样,美元符号 $ 表示行尾,非常适合文件扩展名。