特定の長さの曲のmp3ファイルディレクトリを検索するにはどうすればよいですか?前任者:
findmp3 -min=03:00 -max=03:15 /music/mp3/ebm/
emb/
曲の長さが3分から3分15分の間のディレクトリ内のすべてのmp3ファイルを返します。
私はLinux Mint、Ubuntu、CentOSを使用しています。
答え1
まずインストールしてくださいmp3info
。ディストリビューションリポジトリに存在する必要があります(私は知らなかったので、ある種のLinuxを使用しているとします)。 Debian ベースのディストリビューションがある場合は、次のものを使用できます。
sudo apt-get install mp3info
mp3info
music
インストールが完了したら、次のコマンドを使用して特定の長さの曲のディレクトリを検索できます。
find music/ -name "*mp3" |
while IFS= read -r f; do
length=$(mp3info -p "%S" "$f");
if [[ "$length" -ge "180" && "$length" -le "195" ]]; then
echo "$f";
fi;
done
上記のコマンドはmusic/
mp3ファイルを検索し、長さが180秒(3:00)以上195秒(3:15)以下の場合は名前と長さを出力します。man mp3info
出力形式の詳細については、参考資料を参照してください。
MM:SS形式で時間を入力すると、状況はより複雑になります。
#!/usr/bin/env bash
## Convert MM:SS to seconds.
## The date is random, you can use your birthday if you want.
## The important part is not specifying a time so that 00:00:00
## is returned.
d=$(date -d "1/1/2013" +%s);
## Now add the number of minutes and seconds
## you give as the first argument
min=$(date -d "1/1/2013 00:$1" +%s);
## The same for the second arument
max=$(date -d "1/1/2013 00:$2" +%s);
## Search the target directory for files
## of the correct length.
find "$3" -name "*mp3" |
while IFS= read -r file; do
length=$(mp3info -p "%m:%s" "$file");
## Convert the actual length of the song (mm:ss format)
## to seconds so it can be compared.
lengthsec=$(date -d "1/1/2013 00:$length" +%s);
## Compare the length to the $min and $max
if [[ ($lengthsec -ge $min ) && ($lengthsec -le $max ) ]]; then
echo "$file";
fi;
done
上記のスクリプトを別の名前で保存し、次のfindmp3
ように実行します。
findmp3 3:00 3:15 music/
答え2
findmp3
これには既存のツールがあるかどうか疑われます。 Unixの哲学に基づいてファイルfind
を探す.mp3
、見つかった各ファイルの長さを報告する別のツール、およびいくつかのfind
シェル/テキスト処理接着剤を使用して構築できます。
ソックスサウンドファイルを処理するためによく使用されるユーティリティです(soxは、テキストファイルにsedやawkなどのサウンドを提供します)。注文するsoxi
サウンドファイルに関する情報を表示します。特にsoxi -D
印刷期間(秒)です。
各.mp3
ファイルについて、以下のコードスニペットは対応するsoxi
出力を呼び出して解析します。期間が必要な範囲内にある場合、呼び出しはsh
成功ステータスを返すため、-print
ファイル名の印刷が行われます。
find /music/mp3/ebm -type f -name .mp3 -exec sh -c '
d=$(soxi -D "$0")
d=${d%.*} # truncate to an integer number of seconds
[ $((d >= 3*60 && d < 3*60+15)) -eq 1 ]
' {} \; -print
bash、ksh93、またはzshでは、代わりに再帰的なglobbingを使用できますfind
。 kshではset -o globstar
まず実行してください。 Bashでは、shopt -s globstar
まず実行してください。 bash(kshまたはzshを除く)では、**/
ディレクトリへのシンボリックリンクを介して再帰が発生します。
for f in /music/mp3/ebm/**/*.mp3; do
d=$(soxi -D "$0")
d=${d%.*} # truncate to an integer number of seconds (needed in bash only, ksh93 and zsh understand floating point numbers)
if ((d >= 3*60 && d < 3*60+15)); then
echo "$f"
fi
done
答え3
使用ffmpeg
:
find . -name \*.mp3|while IFS= read -r l;do ffprobe -v 0 -i "$l" -show_streams|awk -F= '$1=="duration"&&$2>=180&&$2<=195'|read&&echo "$l";done
mp3info
1本のライン:
find . -name \*.mp3 -exec mp3info -p '%S %f\n' {} +|awk '$1>=180&&$1<=195'|cut -d' ' -f2-
またはOS Xでは:
mdfind 'kMDItemDurationSeconds>=180&&kMDItemDurationSeconds<=195&&kMDItemContentType=public.mp3' -onlyin .
答え4
ffmpeg -i yourmp3.mp3 2>&1 | grep Duration | sed 's/Duration: \(.*\), start/\1/g' |awk {'print $1'}
上記のコマンドを使用すると、期間を取得できるため、期間ドメインを指定するスクリプトを作成できます。以下も使用できます。
find yourPath -iname "*mp3" -exec ffmpeg -i {} 2>&1 | grep Duration | sed 's/Duration: \(.*\), start/\1/g' |awk {'print $1'}
yourPathをmp3リポジトリのルートディレクトリに置き換えます。