GNUパラレルパラメータの動作が奇妙に見えます。

GNUパラレルパラメータの動作が奇妙に見えます。

そのため、ソースディレクトリとターゲットディレクトリをパラメータとして使用し、ターゲットの場所に同じディレクトリ構造を作成し、ソース内のすべてのファイルを変換してそのターゲットディレクトリのGNUパラレルコマンドに入れる簡単なスクリプトを作成しました。

私のスクリプトは次のとおりです

#!/bin/bash
SOURCE=$1
DEST=$2
find $SOURCE -type f -name '*.flac' -printf "%P\n" | parallel --dry-run mkdir -p $DEST{//}
find $SOURCE -type f -name '*.flac' -printf "%P\n" | parallel --dry-run ffmpeg -loglevel info -i {} -codec:a libmp3lame -qscale:a 3 $DEST{/.}.mp3

すごい! mkdirはうまく動作します(例えば、mkdirは各ファイルのディレクトリを作成しようとしますが、これまでは問題ありません)。

ただし、ffmpeg行では出力は$ DESTで終わりません。実際、 $DEST は --dry-run 出力には表示されないため、空のように見えます。

それで、この記事を書くときにアイデアが浮かび上がり、ffmpegラインを単純化して置き換えて使ってみました。

find $SOURCE -type f -name '*.flac' -printf "%P\n" | parallel --dry-run echo {} $DEST{/.}.mp3

同じ行動を見ました。クール。次に、次のように$ DESTがある場所に移動します。

find $SOURCE -type f -name '*.flac' -printf "%P\n" | parallel --dry-run echo {} {$DEST/.}.mp3

驚くべきことに、$DESTを{/.}に移動すると機能します!ただし、MKDIR ケース ({$DEST//} など) で同じトリックを試しても機能しません。

では、MKDIR ケースでは $DEST{//} のみを使用でき、単純化されたケースでは {$DEST/.} のみ使用できるのはなぜでしょうか。

ありがとうございます!

ベストアンサー1

だから台本をずっと持って遊んでみると、動く夕方を狙う感じがしました。変更と内容を追跡していないため、他に問題がある可能性があります。

しかし、正しく動作するようにスクリプトを変更したと思います。

このスクリプトの目的は、*.flacファイルと*.jpgファイルを含む任意のソースディレクトリをインポートし、ターゲットの場所に同じディレクトリ構造を作成し、そのソースのすべての*.flacファイルを再エンコードして*.mp3を作成することです。です。最後に、ソースディレクトリのすべての* .jpg(カバー)を対応するターゲットディレクトリにコピーします。可能な限り GNU 並列性を使用してください。

TL;DR - 並列性を使用してFLACディレクトリツリーをMP3ディレクトリツリーに変換します。

これが私がついに思い出したものです。

#!/bin/sh
SOURCE=$1
DEST=$2
find $SOURCE -type f -name '*.flac' -printf "%h\n" | uniq | parallel --dry-run mkdir -p {=s:$SOURCE:$DEST:g=}
find $SOURCE -type f -name '*.flac' -printf "%P\n" | parallel --dry-run ffmpeg -loglevel info -i $SOURCE{} -codec:a libmp3lame -qscale:a 3 $DEST{.}.mp3
find $SOURCE -type f -name '*.jpg' -printf "%P\n" | parallel --dry-run cp $SOURCE{} $DEST{}

上記のように、少なくとも--dry-run出力に対しては機能しているようです。 (再)使用してください。

おすすめ記事