모든 디렉터리와 하위 디렉터리를 반복하고 특정 확장자를 가진 파일을 찾은 다음 FFMPEG를 실행하고 새 라이브러리에 복사하는 방법

모든 디렉터리와 하위 디렉터리를 반복하고 특정 확장자를 가진 파일을 찾은 다음 FFMPEG를 실행하고 새 라이브러리에 복사하는 방법

저는 오늘과 어제 해결책을 찾으려고 연구해 왔지만 지금까지 그 어느 것도 제게 도움이 되지 않았습니다.

예를 들어:https://stackoverflow.com/questions/5784661/how-do-you-convert-an-entire-directory-with-ffmpeg

/Music/폴더(예 : )의 모든 파일을 반복하고, 로 끝나는 모든 디렉터리나 하위 디렉터리에서 파일을 찾은 .flac다음 다음을 사용하여 해당 flac 파일을 alac 파일로 변환할 수 있기를 원합니다 .

ffmpeg -i "$i" -c copy -acodec alac "${i%.*}.m4a"

$i 변수는 for 루프에 있는 파일의 "이름"입니다. ${i%.*}.flac 부분이 아닌 이름만 반환되어야 합니다.

어쨌든, 이 명령을 실행한 후 저장된 모든 .m4a alac 파일을 "새 라이브러리"로 전송하고 싶습니다... IE: /Music/라이브러리가 두 개 있습니다.

하나는 모든 flac 파일을 보유합니다.

하나에는 모든 alac(m4a) 파일이 있습니다.

가능합니까?

이것은 지금까지 내가 가지고 있는 명령인데 전혀 작동하지 않으며, 작동하더라도 내가 원하는 대로 새 라이브러리를 생성하지 않습니다.for i in *.flac; do ffmpeg -i "$i" -c copy -acodec alac "${i%.*}.m4a"; done

현재 명령에서 오류가 발생합니다 *.flac: No such file or directory. 이는 하위 디렉터리를 검색하지 않기 때문이라고 가정합니까? ...

답변1

#!/bin/bash

shopt -s globstar

src_dir="Music"
dest_dir="Music_new"

for orig_path in "${src_dir}"/**/*.flac; do
    #Change first directory in the path
    new_path=${orig_path/$src_dir/$dest_dir}

    #Remove filename from new path. Only directories are left.
    #They are needed for mkdir
    dir_hier=${new_path%/*}

    #Remove extension .flac from path, thus we have original path with first directory
    #changed and file extension removed.
    #Original path:   "Music/one/two/song.flac"
    #New path:        "Music_new/one/two/song"
    new_path=${new_path%.*}

    echo mkdir -p "$dir_hier"

    #New path with extension:   "Music_new/one/two/song.m4a"
    #ffmpeg should create new file by this path, necessary directories
    #already created by mkdir
    echo ffmpeg -i "$orig_path" -c copy -acodec alac "${new_path}.m4a"
done

echo검사 전 mkdir, ffmpeg검사 후 삭제해야 합니다.

관련 정보