再生時間が3分未満のオーディオファイルの検索と削除

再生時間が3分未満のオーディオファイルの検索と削除

再生時間が3分未満のすべてのオーディオファイル(MP3ファイル)を繰り返し見つけて削除する方法はありますか?

ディレクトリ、テキストファイル、mp3ファイルなど、さまざまな形式のファイルが混在している状況を考えてみましょう。

答え1

これは一つの方法です。各mp3ファイルに対して実行し、mediainfo3分未満の場合は削除します。

#!/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のようなシェルスクリプトを一緒にまとめる必要があります。

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

さまざまなオーディオファイル形式の再生時間を印刷するためのツールがたくさんありますsoxmediainfo使用するツールはオーディオファイル形式によって異なりますが、教えてくれませんでした。

などを使用してこの出力を処理し、grepファイルを削除するかどうかの条件として、ループ内のシェルスクリプトで使用できます。

答え4

何らかの理由で私の find-foo は同等ではなかったので、検索の置き換えのために 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

関連情報