使用bash或sed从文件名中删除模式之间的字符串

使用bash或sed从文件名中删除模式之间的字符串,bash,sed,Bash,Sed,我有一大组.mp3文件,每个文件都有类似的文本模式,如下所示 “Yethamaiyaa Yetham HD极致品质。-V7NEP5gnTTY.mp3” 其中实际曲目名称仅为 “Yethamaiyaa Yetham.mp3” 还有这个额外的字符串 'HD Extreme Quality.-V7NEP5gnTTY'附在每个文件后 如何删除从HD开始并在.mp3之前的不必要字符串。问题是在标记字符串之间有一个额外的点。此外,所有400多个文件的标记模式都相同。任何有助于解决这个问题的帮助都是值得的 l

我有一大组.mp3文件,每个文件都有类似的文本模式,如下所示

“Yethamaiyaa Yetham HD极致品质。-V7NEP5gnTTY.mp3”

其中实际曲目名称仅为

“Yethamaiyaa Yetham.mp3”

还有这个额外的字符串

'HD Extreme Quality.-V7NEP5gnTTY'
附在每个文件后

如何删除从
HD
开始并在
.mp3
之前的不必要字符串。问题是在标记字符串之间有一个额外的点
。此外,所有400多个文件的标记模式都相同。任何有助于解决这个问题的帮助都是值得的

ls *.mp3 | sed  -n "s/^\(.*\) HD .*/mv -- '&' '\1.mp3'/p"  | bash
上面的代码使用
sed
删除从“HD”到文件名末尾的所有内容。“HD”之前的文件名部分由parens捕获,以便以后可以作为
\1
使用。用所需的
mv
命令替换整条线路。我非常仔细地引用它来解释文件名中的空格

如果您想查看它将执行的命令而不执行它们,请将管道留给bash

预览命令:

ls *.mp3 | sed -n "s/^\(.*\) HD .*/mv -- '&' '\1.mp3'/p" 

请将示例输入(无描述、无图像、无链接)和您对该示例输入的所需输出添加到您的问题中(无评论)。在*.mp3中查找f的mah no ls:-)
;do echo mv-v--“$f”“${f%HD*}.mp3”;完成
,如果需要,请删除回显…感谢您的输入。很高兴知道另一种做这项工作的方法。但我已经用公认的答案完成了这项工作。根据Cyrus的评论,
ls
output解析是个坏消息,尤其是将它传送给bash。我认为,对于一个快速而肮脏的脚本,您已经预览了文件名,并且没有处于潜在的敌对环境中,您应该可以解析
ls
的输出。但是风险是存在的,并且没有可能的编码方法-例如,嵌入了\n的fliename。