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
これは各ディレクトリパス名がであるfolder1
etc。ディレクトリを繰り返します。各ディレクトリパス名に対して、ループ本体はそのディレクトリのワイルドカードパターンを展開し、パターンの最初の2つの一致を使用してコマンドを実行します。実際、パターンに2つの一致があるかどうかを確認するためのチェックは行われません。folder2
$dirpath
*.mp3
ffmpeg
上記の2つのループの違いは、最初のループはディレクトリを各ディレクトリ$dirpath
に変更しないため、そのディレクトリへのディレクトリパスを含むことです$1
。$2
そのため"$dirpath/both_${1##*/}"
、ディレクトリに呼び出されたファイルへのパスを作成しました(サブストリングを挿入するには、both_something.mp3
ディレクトリパスを最初から削除する必要がありました)。$1
both_
cd
別のループは、ループ内の各ディレクトリにディレクトリを変更するために使用されます。これにより$1
、$2
文字列は初期ディレクトリパスのパス名ではなくファイル名になります。cd
サブシェル()内で発生するため、作業(...)
ディレクトリへの変更は角かっこ内のコマンドにのみ影響します。