gnu パラレル: ファイル名に引用された引数と空白があります。それを処理する方法?

gnu パラレル: ファイル名に引用された引数と空白があります。それを処理する方法?

これが私を狂わせます。

使いたいmp3がたくさんありますffmpeg

次の行を使用しようとしています(スクリプトが大きく、これが問題になる部分です)。

find . -type f \( -iname \*.mp3 \) | parallel ffmpeg -i "{}" -acodec libmp3lame -ab 128k "$output_folder_with_spaces/{.}-128k.mp3" \;

iname(今後さらに拡張することができるので、このセクションが存在します)

しかし、引用符を付けてもmp3の名前があるので、{}常にそのような言葉を聞きます。それも効果があるかもしれません。No such file or directory01 - My song"$output_folder_with_spaces"

Googleでたくさん検索しましたが、次の例が見つかりませんでした。スペースを含めるには{}fromを使用してください。変数またはハードコーディングされたパスを引用符で囲んで使用した場合にのみ、これが見つかりました。find{}

この場合、空間の問題をどのように解決できるかをご存知ですか?

答え1

無効な代替文字列を使用していますparallel。引用された引数も渡す必要があり、末尾が何であるか-qよくわかりません...例:\;

dirname_with_spaces="/home/don/my dir with spaces/"

/(に割り当てられたパスの末尾を参照してくださいdirname_with_spaces)そして、ディレクトリmp3にスペースがあるいくつかのファイル名はtestここにありますcwd

./test/Commercial DEMO - 09.mp3
./test/Commercial DEMO - 11.mp3
./test/Handel Royal Fireworks - 07.mp3
./test/Jazz Rag Ensemble - 10.mp3
./test/Mouret - Rondeau.mp3

使用

find . -type f -iname \*.mp3 | parallel -q ffmpeg -i {} -acodec \
libmp3lame -ab 128k "$dirname_with_spaces"{/.}-128k.mp3

次のファイルが生成されます。

/home/don/my dir with spaces/Commercial DEMO - 11-128k.mp3
/home/don/my dir with spaces/Commercial DEMO - 09-128k.mp3
/home/don/my dir with spaces/Handel Royal Fireworks - 07-128k.mp3
/home/don/my dir with spaces/Jazz Rag Ensemble - 10-128k.mp3
/home/don/my dir with spaces/Mouret - Rondeau-128k.mp3

コマンドラインquoting( ) と次のコマンドparallel -qの使用に注意してください。

{}
    Input line.

findこれは、次の出力へのパスを意味します./test/Mouret - Rondeau.mp3

{/.}
    Basename of input line without extension. 

拡張Mouret - Rondeau"$dirname_with_spaces"{/.}へ拡張/home/don/my dir with spaces/Mouret - Rondeau

後者は{.}コマンドで使用されているものとはかなり異なります。

{.}
    Input line without extension.

それは拡張され./test/Mouret - Rondeau、次に "$dirname_with_spaces"{.}拡張されます/home/don/my dir with spaces/./test/Mouret - Rondeau。明らかに、これは/./test/アンダーがないので間違っているでしょう/home/don/my dir with spaces

答え2

find構文を誤って理解しました。この{}構文はと一緒に使用されます-exec。また、対応する括弧は必要ありません。デフォルトの作業順序をオーバーライドする場合にのみ必要です(左から右に評価しないなど)。全体的にexecの場合は次のようになります(水平スクロールを避けるために分割)。

find . -type f -iname \*.mp3 -exec \
    ffmpeg -i "{}" -acodec libmp3lame -ab 128k \
    "$output_folder_with_spaces/{}-128k.mp3" \;

これはあなたにfoo.mp3-128.mp3...というファイルを提供します。これがあなたが望むものであることを願っています。これが何を意味するのかわかりません{.}。少なくともGNU findの場合、有効な構文ではありません。

lameFFmpeg経由ではなく直接使用することをお勧めします(-abVBRモードではなくABRモードを使用している場合は、正当な理由なく使用しないことをお勧めします)。実際にMP3を再エンコードしないことをお勧めします。ロスレスソースでエンコードすると、同じビットレートでより良い品質が得られます。

関連情報