来自夏威夷的阿罗哈,
我希望一切都好。在终端中,我试图使音频文件扩展名 .mp3、.wav、.m4p、.aiff、.m4a 的所有文件名都是唯一的。我有数千个,因此为了做到这一点,我需要在文件扩展名之前添加额外的递增数字。文件名应保留。
例如:snoopdog.mp3、music2010.wav、stackexchange.aiff、youtubemusic.mp3、facebookmusic.m4a、twittermusic.aiff
最终结果:snoopdog1.mp3、music20102.wav、stackexchange3.aiff、youtubemusic4.mp3、facebookmusic5.m4a、twittermusic6.aiff
请问如何在终端中执行此操作。谢谢!
答案1
像这样的东西:
i=1
for file in ./*; do
ext=${file##*.}
basename=${file%.*}
mv -n -- "$file" "$basename$i.$ext"
i=$((i+1))
done
会给你facebookmusic1.m4a music20102.wav snoopdog3.mp3 stackexchange4.aiff twittermusic5.aiff youtubemusic6.mp3
。顺序来自默认的字典排序,因此字母f
排在第一位,等等。
这将重命名当前目录中的所有文件,但如果您只想更改具有该表达式的文件,您可以执行以下任一操作
for file in *.mp3 *.aiff *.m4a *.wav; do
if [ -f "$file" ]; then
...
fi
done
或者
shopt -s extglob
for file in *.@(mp3|aiff|m4a|wav); do
...
其中第一个应该在所有 shell 中工作,但会影响排序顺序,而后者可以在 Bash 中工作。 (在 ksh 中同样有效,无需在 zsh 中shopt
使用 , 或使用*.(mp3|aiff|m4a|wav)
。)
使用 Perl工具,滥用和变量rename
的特殊状态,您可以达到类似的效果(尽管如果有多个点,这将替换第一个点):$a
$b
rename -v 's/\./ ++$a . "." /e' *