查找并删除播放时间少于 3 分钟的音频文件

查找并删除播放时间少于 3 分钟的音频文件

有没有办法递归查找并删除所有播放时间少于 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 脚本。

您可以使用ffprobeffmpeg组来获取以秒为单位的持续时间 -

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

有许多工具可以打印各种音频文件格式的播放持续时间,例如soxmediainfo。使用哪种工具取决于您的音频文件的格式,但您没有告诉我们。

您可以使用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

相关内容