한 디렉토리에 많은 폴더가 있고 각 폴더에는 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
이것은 각 디렉토리 경로명이 인 folder1
etc. 디렉토리를 반복합니다 . 각 디렉토리 경로명에 대해 루프 본문은 해당 디렉토리의 와일드카드 패턴을 확장한 다음 패턴의 처음 두 일치 항목을 사용하여 명령을 실행합니다 . 실제로 패턴에 대해 두 개의 일치 항목이 있는지 확인하기 위한 검사는 수행되지 않습니다.folder2
$dirpath
*.mp3
ffmpeg
위 두 루프의 차이점은 첫 번째 루프는 디렉터리를 각 $dirpath
디렉터리 로 변경하지 않으므로 해당 디렉터리에 대한 디렉터리 경로를 포함한다는 것입니다 $1
. $2
그래서 "$dirpath/both_${1##*/}"
디렉토리에 호출된 파일에 대한 경로를 생성 하곤 했습니다( 하위 문자열을 삽입하려면 both_something.mp3
디렉토리 경로를 처음부터 제거해야 했습니다 ).$1
both_
cd
또 다른 루프는 루프의 각 디렉터리로 디렉터리를 변경하는 데 사용됩니다 . 이렇게 하면 $1
및 $2
문자열은 초기 디렉토리 경로의 경로 이름이 아닌 파일 이름이 됩니다. cd
하위 쉘( ) 내에서 발생하므로 작업 (...)
디렉토리에 대한 변경은 대괄호 안의 명령에만 영향을 미칩니다.