有没有办法递归查找并删除所有播放时间少于 3 分钟的音频文件(MP3 文件)?
考虑我混合有多种格式文件(例如目录、文本文件和mp3 文件)的情况。
答案1
这是一种方法。对每个mp3文件运行mediainfo
,如果短于3分钟,则将其删除。
#!/bin/bash
for FILE in $(find . -type f -name \*.mp3); do
[[ $(mediainfo --Output='Audio;%Duration%' "${FILE}") -lt "180000" ]] && rm "${FILE}"
done
或者对于喜欢俏皮话的人来说:
find . -type f -name \*.mp3 -exec bash -c '[[ $(mediainfo --Output="Audio;%Duration%" $1) -lt "180000" ]] && rm "$1"' -- {} \;
答案2
您需要像 @dirkt 在他的回答中提到的那样拼凑一个 shell 脚本。
您可以使用ffprobe
该ffmpeg
组来获取以秒为单位的持续时间 -
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 /path/to/mp3/file.mp3
您可以使用find
查找以给定目录和任何/所有子目录结尾的所有文件.mp3
,并调用提供找到的任何文件的路径/文件名的脚本
find /search/from/dir -type f -iname "*.mp3" -exec /path/to/delete_if_short.sh {} \;
创建delete_if_short.sh
脚本 - 使用ffprobe
命令检查长度,如果低于 180(值以秒为单位,因此 3 分钟),则rm
文件和您都可以使用。
答案3
有许多工具可以打印各种音频文件格式的播放持续时间,例如sox
等mediainfo
。使用哪种工具取决于您的音频文件的格式,但您没有告诉我们。
您可以使用grep
等处理此输出,并在循环内的 shell 脚本中使用它作为是否删除文件的条件。
答案4
由于某种原因,我的 find-foo 没有达到标准,所以我破解了一个 find 替换的 stackexchange 答案并想出了这个。
#!/bin/bash
# mytime is the number of seconds of the mp3 that you want to delete,
# in this case 3 minutes
mytime=180
files="$(find -L "<put your top level directory here>" -type f -name "*.mp3")";
# are there any files at all?
if [[ "$files" == "" ]]; then
echo "No files";
return 0;
fi
echo "$files" | while read file; do
# take the file, find the time, convert to seconds
times="$(mp3info -p "%m:%s\n" "$file" |awk -F':' '{print ($1*60)+$2}')"
# if that is greater than 3*60, we delete the file, which is $file.
if [[ "$times" -lt "mytime" ]]
then
# WARNING, there be dragons here...
echo "We are removing $file from the system..."
rm "$file"
fi
done