次のコマンドは、mp4ビデオファイルの長さを示します。
find -type f -name "*.mp4" -print0 | \
xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | \
perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | \
tail -n 1
誰かがそれを分析し、なぜこれを説明できますか?
再入力またはコピーして貼り付ける必要なく、引き続き使用できる方法を知っておくと便利です。
答え1
find -type f -name "*.mp4" -print0
現在のディレクトリで名前で終わる通常のファイルを繰り返し検索し、対応する相対パス名.mp4
をnullバイトで区切って印刷します。改行はファイル名で有効な文字なので、-print0
ここよりも安全です。-print
検索(1)
| xargs -0
入力を次のコマンドの引数として使用します。入力はヌルで区切られます。xargs(1)
mplayer -vo dummy -ao dummy -identify 2>/dev/null
これが実行されるコマンドですxargs
。仮想ビデオおよびオーディオドライバを使用して簡単に解析できる形式でファイルパラメータを表示します。 STDERRのすべての出力を削除します。プレイヤー(1)
| perl -nle
出力をPerlにパイプします。 Perl は入力行を変数として読み込み、末尾$_
から改行文字を削除します。フェレン(1)
/ID_LENGTH=([0-9\.]+)/
行がこの正規表現と一致する場合は、「ID_LENGTH =」の後の数字をキャプチャしてください。
&& ($t +=$1)
$t
その後、最初のゲームでキャッチした数だけ変数を増やし、
&& printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60'
そしてそれから時間、分、秒を計算します$t
。これは秒数です。 Perl 呼び出しでは、自動的に改行がステートメント-l
に追加されますが、改行は追加されないため、書式文字列に ("\n") が含まれます。print
printf
| tail -n 1
出力の最後の行だけが印刷されます。尾(1)
このパイプを単一のコマンドにするには、シェルまたは.bashrc
シェルで使用されるrcファイルにシェル関数を作成できます。例は次のとおりです。
vid_lengths() {
find -type f -name "*.mp4" -print0 \
| xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null \
| perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' \
| tail -n 1
}