我有数千个MP3文件,但都有不寻常的文件名,如1-2songone.mp32songtwo.mp32_2_3_songthree.mp3。我想删除这些文件开头的所有数字、破折号和下划线,并得到结果:

songone.mp3
songtwo.mp3
songthree.mp3

最佳答案

这可以使用扩展全局搜索完成:

$ ls
1-2songone.mp3  2_2_3_songthree.mp3  2songtwo.mp3
$ shopt -s extglob
$ for fname in *.mp3; do mv -- "$fname" "${fname##*([-_[:digit:]])}"; done
$ ls
songone.mp3  songthree.mp3  songtwo.mp3

这将使用parameter expansion${fname##pattern}fname开头删除最长的可能匹配。作为模式,我们使用*([-_[:digit:]]),其中*(pattern)表示“模式的零个或多个匹配”,而实际模式是hyhpens、下划线和数字的括号表达式。
评论:
--之后的mv表示move选项的结束,并确保以-开头的文件名不会被解释为选项。
*()表达式需要extglobshell选项。如前所述,如果以后不需要扩展globs,则必须使用shopt -u extglob重新设置它。
根据Gordon Davisson的评论:如果您有类似1file.mp32file.mp3的文件,这将删除文件。为了避免出现这种情况,您可以使用mv -i(或--interactive)在覆盖文件之前提示您,或者使用mv -n(或--noclobber)不覆盖任何文件。
triplee指出,如果文件不是以斜线、下划线或数字开头,则这会不必要地将文件移动到自身。为了避免这种情况,我们只能在匹配的文件上迭代
for fname in [-_[:digit:]]*.mp3; do mv -- "$fname" "${fname##*([-_[:digit:]])}"; done

确保有东西要重命名。

10-01 20:41
查看更多