我有数千个MP3文件,但都有不寻常的文件名,如1-2songone.mp3
,2songtwo.mp3
,2_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
选项的结束,并确保以-
开头的文件名不会被解释为选项。*()
表达式需要extglob
shell选项。如前所述,如果以后不需要扩展globs,则必须使用shopt -u extglob
重新设置它。根据Gordon Davisson的评论:如果您有类似
1file.mp3
和2file.mp3
的文件,这将删除文件。为了避免出现这种情况,您可以使用mv -i
(或--interactive
)在覆盖文件之前提示您,或者使用mv -n
(或--noclobber
)不覆盖任何文件。triplee指出,如果文件不是以斜线、下划线或数字开头,则这会不必要地将文件移动到自身。为了避免这种情况,我们只能在匹配的文件上迭代
for fname in [-_[:digit:]]*.mp3; do mv -- "$fname" "${fname##*([-_[:digit:]])}"; done
确保有东西要重命名。