再生時間が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のようなシェルスクリプトを一緒にまとめる必要があります。
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
ファイルを削除するかどうかの条件として、ループ内のシェルスクリプトで使用できます。
答え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