web-dev-qa-db-ja.com

サブディレクトリをクロールし、ffmpegでコマンドを実行するbashスクリプトを作成します

現在、私はこのコマンドを実行します...

# Script designed to convert webm files to m4a for easy listening

for i in *.m4a ; do
    echo ffmpeg -i "\""$PWD/$i"\"" -c:a copy "\""$PWD/${i%.m4a}.mkv"\"" >> ~/bulk.command.txt
done

スクリプトファイルを自分で作成し、後で実行してメディアファイルのバッチ再パッケージ化を行うことができます。残念ながら、このプロセスでは、再パッケージ化する必要がある各ディレクトリを入力し、スクリプト名を入力する必要があります。

これらのプロジェクトには、かなりの数のディレクトリとサブディレクトリがある場合があります。また、これらのプロジェクトは大きくなると、プロジェクトのルートディレクトリのサイズに注意する必要があります。

私はまだbashでコーディングする方法を学んでいますが、この単純なスクリプトを使用すると、考えられるすべてのファイル名を確実に把握できるようになるまでかなり時間がかかりました。

次に、ホームフォルダーの音楽フォルダーに移動してこのコマンドを1回実行し、ディレクトリレイアウトを保存するだけでなく、ffmpegが作成したファイルを別のディレクトリ。ウィザードには、このタスクを達成するためのコード例、用語、またはアイデアがありますか?

2
Monery

再帰的なグロビングを有効にして、サブディレクトリに再帰します。

shopt -s globstar

その後、あなたがすることができます:

for f in **/*.m4a
do
    printf 'ffmpeg -i %q -c:a copy %q\n' "$PWD/$f" "$PWD/${f%.m4a}.mkv"
done > bulk.command.txt

printf%qは、シェル入力として安全に使用できるように文字列を引用符で囲むため、引用符で混乱する必要はありません。

  %q    quote the argument in a way that can be reused as Shell input

これをスクリプトにすると、引数を使用して、出力ファイルに別のディレクトリを使用するかどうかを決定できます。

#! /bin/bash
shopt -s globstar

for f in **/*.m4a
do
    printf 'ffmpeg -i %q -c:a copy %q\n' "$PWD/$f" "${1:-$PWD}/${f%.m4a}.mkv"
done > bulk.command.txt

${foo:-bar}は、空でない場合は変数fooの値を使用し、空でない場合はbarを使用するため、この場合は空でない場合は最初の引数を使用し、$PWD さもないと。

その場合は、ディレクトリ構造を再作成する必要があります。これは、mkdir -p

#! /bin/bash
shopt -s globstar

for f in **/*.m4a
do
    printf 'mkdir -p %q\n' "${1:-$PWD}/${f%/*}"
    printf 'ffmpeg -i %q -c:a copy %q\n' "$PWD/$f" "${1:-$PWD}/${f%.m4a}.mkv"
done > bulk.command.txt

これは、後で使用するためにスクリプトを本当に作成する必要がある場合です。個人的には、ポイントはわかりません。実際にループを実行する必要があるときに直接ループを実行できます。

#! /bin/bash
shopt -s globstar

for f in **/*.m4a
do
    mkdir -p "${1:-$PWD}/${f%/*}"
    ffmpeg -i "$PWD/$f" -c:a copy "${1:-$PWD}/${f%.m4a}.mkv"
done > bulk.command.txt
3
muru