我搞砸了,意外地得到了一堆带有扩展名的文件.mp3.mp3.mp3.mp3
我怎样才能以递归方式(并在多个目录中)更改这些内容以将它们设置为.mp3
?
答案1
有一个相当简单的解决方案,就是从第一个“.mp3”中删除所有内容,然后再添加“.mp3”。所以:
for file in $(find . -name "*.mp3"); do mv "$file" "${file%%.mp3*}.mp3"; done
答案2
使用rename
perl 附带的实用程序(在某些系统上可能称为perl-rename
)和带有的 shell **
(zsh 或 bashshopt -s globstar
等):
rename 's/(\.mp3)+$/.mp3/' /somedir/**/*.mp3
答案3
使用find
命令bash
和一些创造性的脚本,可以神奇地清理这个问题。以下脚本在 Mac OS X 10.9.5 上进行了测试,但在 Linux 上也应该可以正常工作。首先将其作为“试运行”运行,以确保您定位正确的文件:
find '/path/to/your/files' -type f -name '*.mp3.mp3*' |\
while read RAW_FILE
do
DIRNAME=$(dirname "$RAW_FILE")
BASENAME=$(basename "$RAW_FILE")
FILENAME="${BASENAME%%.*}"
EXTENSION="${BASENAME#*.}"
echo "mv "${RAW_FILE}" "${DIRNAME}/${FILENAME}".mp3"
done
您首先应更改/path/to/your/files
以匹配系统上受影响文件的实际路径。还请注意最后一行,它是echo
的mv
(移动)命令。我这样做是为了确保脚本针对正确的文件。
核心find
逻辑是这样的:
find '/path/to/your/files' -type f -name '*.mp3.mp3*'
这基本上意味着,“查找路径中所有/path/to/your/files
实际是文件(而不是目录)且文件名模式与 匹配的文件。 *.mp3.mp3*
这应该捕获任何/所有附加了多个 的文件.mp3
;.mp3.mp3
,,,,等等....mp3.mp3.mp3
.mp3.mp3.mp3.mp3
.mp3.mp3.mp3.mp3.mp3
该脚本不会费心去处理只有正确文件的文件,.mp3
如果只有一小部分文件命名错误,.mp3.mp3.mp3.mp3
而不必重命名所有文件,这绝对是一个速度优势.mp3
。
mv
因此,当您运行该命令时,您应该会看到一个可以解决您的问题的“dry run”命令列表:找到所有这些.mp3
文件并将它们重命名为正确的单数.mp3
。
现在运行良好,只需像这样运行最终脚本:
find '/path/to/your/files' -type f -name '*.mp3.mp3*' |\
while read RAW_FILE
do
DIRNAME=$(dirname "$RAW_FILE")
BASENAME=$(basename "$RAW_FILE")
FILENAME="${BASENAME%%.*}"
EXTENSION="${BASENAME#*.}"
mv "${RAW_FILE}" "${DIRNAME}/${FILENAME}".mp3
done
请注意,最后一行是实际的功能mv
命令。当您运行此版本的脚本时,将搜索整个目录以查找这些文件.mp3
,然后实际运行完整mv
命令来解决问题。