모든 .ape 파일을 다른 하위 폴더의 .flac로 변환

모든 .ape 파일을 다른 하위 폴더의 .flac로 변환

avconv명령줄을 사용하여 일부 .ape 파일을 .flac 파일로 변환하려고 했습니다 . 분명히 avconv여기서의 요점은 아닙니다. 구문은 매우 간단합니다 avconv -i inputApeFile.ape outputFlacFile.flac.

요점은 파일이 더 많은 하위 폴더에 중첩되어 있다는 것입니다. 즉, Artist 폴더가 있고 다양한 CD 하위 폴더가 있는데 각 폴더에는 서로 다른 .ape 파일이 포함되어 있습니다. 모든 파일을 변환한 다음 원본 파일과 동일한 폴더에 .flac 확장자로 저장하려면 어떻게 해야 합니까?

가능하다면 스크립트를 사용하지 않고 한 줄에 쉘 명령만 사용하고 싶습니다. 내 생각엔 그런 게 있어야 할 것 같아

avconv -i 'ls -R | grep ape' '???'

하지만 두 번째 부분이 막혔어요(어쩌면 sed??!?를 사용했을 수도 있음)

답변1

필요한 명령은 다음과 같습니다.

find /path/to/MainDir/ -type f -name "*.ape"  -execdir sh -c ' avconv -i "$1" "${1%.ape}.flac" ' _ {} \;

접미사가 있는 각 파일을 찾은 다음 접미사가 .ape있는 동일한 파일 이름으로 .flac원본 파일이 있는 위치와 동일한 위치로 변환합니다.

{}현재 발견된 파일의 경로입니다.
테스트 보기여기

답변2

아래의 (파이썬) 스크립트가 작업을 수행해야 합니다. 빈 파일에 복사하고 로 저장한 후 convert.py스크립트의 헤드 섹션에 있는 파일로 디렉터리를 설정하고( convert_dir =) 다음 명령으로 실행합니다.

python3 /path/to/convert.py

스크립트

#!/usr/bin/env python3

convert_dir = "/path/to/folder/tobeconverted"

import os
import subprocess

for root, dirs, files in os.walk(convert_dir):
    for name in files:
        if name.endswith(".ape"):
            # filepath+name
            file = root+"/"+name
            # to use in other (convert) commands: replace the "avconv -i" by your command, and;
            # replace (".ape", ".flac") by the input / output extensions of your conversion
            command = "avconv -i"+" "+file+" "+file.replace(".ape", ".flac")
            subprocess.Popen(["/bin/bash", "-c", command])
        else:
            pass

답변3

이제 다시 avconv보다 ffmpeg가 선호되고 값싼 코어 컴퓨터가 많이 있으므로(8 코어 XU4의 경우 60달러) 다음이 가장 효과적이라고 생각합니다.

#!/bin/bash

#
# ape2flac.sh
#

function f2m(){
        FILE=$(echo "$1" | perl -p -e 's/.ape$//g');
        if [ ! -f "$FILE".flac ] ; then
                ffmpeg -v quiet -i "$FILE.ape" "$FILE.flac"
        fi
}
export -f f2m
find "$FOLDER" -name '*.ape' | xargs -I {} -P $(nproc) bash -c 'f2m "$@"' _ "{}"

답변4

찾고 있는 한 줄 명령:
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
find명령은 다음으로 끝나는 파일만 제공합니다..원숭이
명령 은 해당 파일을 변환하고 입력 파일(예: .ape)과 동일한 폴더에 보관할 수 있도록 명령 find에 대한 상대 경로를 제공합니다 . 명령은 하위 디렉토리에 얼마나 깊이 보관되어 있는지에 관계없이 해당 디렉토리의 모든 파일을 찾습니다.avconv
find

관련 정보