ffmpeg를 사용하여 폴더를 반복하고 mp3 파일을 연결합니다.

ffmpeg를 사용하여 폴더를 반복하고 mp3 파일을 연결합니다.

한 디렉토리에 많은 폴더가 있고 각 폴더에는 2개의 mp3 파일이 포함되어 있습니다. 따라서 다음 파일을 찾을 수 있습니다.

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

각 폴더의 첫 번째 파일을 두 번째 파일과 연결하고 싶습니다.

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. 디렉토리를 반복합니다 . 각 디렉토리 경로명에 대해 루프 본문은 해당 디렉토리의 와일드카드 패턴을 확장한 다음 패턴의 처음 두 일치 항목을 사용하여 명령을 실행합니다 . 실제로 패턴에 대해 두 개의 일치 항목이 있는지 확인하기 위한 검사는 수행되지 않습니다.folder2$dirpath*.mp3ffmpeg

위 두 루프의 차이점은 첫 번째 루프는 디렉터리를 각 $dirpath디렉터리 로 변경하지 않으므로 해당 디렉터리에 대한 디렉터리 경로를 포함한다는 것입니다 $1. $2그래서 "$dirpath/both_${1##*/}"디렉토리에 호출된 파일에 대한 경로를 생성 하곤 했습니다( 하위 문자열을 삽입하려면 both_something.mp3디렉토리 경로를 처음부터 제거해야 했습니다 ).$1both_

cd또 다른 루프는 루프의 각 디렉터리로 디렉터리를 변경하는 데 사용됩니다 . 이렇게 하면 $1$2문자열은 초기 디렉토리 경로의 경로 이름이 아닌 파일 이름이 됩니다. cd하위 쉘( ) 내에서 발생하므로 작업 (...)디렉토리에 대한 변경은 대괄호 안의 명령에만 영향을 미칩니다.

관련 정보