"find"コマンドの解析

次のコマンドは、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") が含まれます。printprintf

| 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
}

おすすめ記事