ffmpegを使用してフォルダを繰り返し、mp3ファイルをリンクします。

ffmpegを使用してフォルダを繰り返し、mp3ファイルをリンクします。

1つのディレクトリに多数のフォルダがあり、各フォルダには2つのmp3ファイルが含まれています。したがって、次のファイルを見つけることができます。

first=$(find ./*/* -type f | sort | awk 'NR % 2 == 1')
second=$(find ./*/* -type f | sort | awk 'NR % 2 == 0')

各フォルダの最初のファイルを2番目のファイルに関連付けたいです。

ffmpeg -i "concat:$first|$second" -c copy "both_"$first

私が見つけたこのstackoverflowの答えしかし、私の目的に合わせて使用​​するのか、どのように使用するのかわかりません。

ディレクトリ構造:

folder "files"
  |
  |--folder1
  |      |--001_001.mp3
  |      |--001_003.mp3
  |
  |--folder2
         |--001_004.mp3
         |--001_009.mp3
  ...

どんな助けでも大変感謝します。

答え1

findこの場合、依存しない方が簡単で強力になると思います。明確に定義されたディレクトリ構造を持ち、findファイルがどこにあるかを正確に知っているので、それを使用してナビゲートする理由はありません。

代わりにシェルループを使用してください。

for dirpath in files/*/; do
    set -- "$dirpath"/*.mp3
    ffmpeg -i "concat:$1|$2" -c copy "$dirpath/both_${1##*/}"
done

または、

for dirpath in files/*/; do
  (
    cd "$dirpath"
    set -- *.mp3
    ffmpeg -i "concat:$1|$2" -c copy "both_$1"
  )
done

これは各ディレクトリパス名がであるfolder1etc。ディレクトリを繰り返します。各ディレクトリパス名に対して、ループ本体はそのディレクトリのワイルドカードパターンを展開し、パターンの最初の2つの一致を使用してコマンドを実行します。実際、パターンに2つの一致があるかどうかを確認するためのチェックは行われません。folder2$dirpath*.mp3ffmpeg

上記の2つのループの違いは、最初のループはディレクトリを各ディレクトリ$dirpathに変更しないため、そのディレクトリへのディレクトリパスを含むことです$1$2そのため"$dirpath/both_${1##*/}"、ディレクトリに呼び出されたファイルへのパスを作成しました(サブストリングを挿入するには、both_something.mp3ディレクトリパスを最初から削除する必要がありました)。$1both_

cd別のループは、ループ内の各ディレクトリにディレクトリを変更するために使用されます。これにより$1$2文字列は初期ディレクトリパスのパス名ではなくファイル名になります。cdサブシェル()内で発生するため、作業(...)ディレクトリへの変更は角かっこ内のコマンドにのみ影響します。

関連情報