2016-06-19 2 views
2

.flac 개의 파일이 들어있는 여러 하위 디렉토리가있는 디렉토리가 있습니다. 일괄 처리를 .mp3 (으)로 변환하고 싶습니다. 경로 이름에는 공백이 포함됩니다. 지금이여러 디렉토리에서 파일을 일괄 처리

find . -type f -regex .*.flac -exec ffmpeg -i {} -c:a mp3 -b:a 320k \; 

같은 것을하고 싶어하지만 문제는, 어떻게 출력 파일 이름을 FFmpeg를 제공하기 위해 mp3에 대한 {} 및 대체 flac를 사용할 수 있습니까? bash에서는 변수 대체 ${file%.flac}.mp3을 사용할 수 있지만 여기서는 적용 할 수 없습니다. sed 기반의 접근 방식은 find과 작동하지 않습니다. 간단한 해결책이 있습니까?

shopt -s globstar nullglob 
for file in **/*.flac; do 
    [[ -f $file ]] || continue 
    out_file=${file%.flac}.mp3 
    ffmpeg # your options here, using "$out_file" 
done 

체크 [[ -f $file ]].flac에서 끝나는 디렉토리를 건너 뜁니다 : 당신이 떠들썩한 파티를 사용하는 경우

+1

Btw. quote'* .flac'. – Cyrus

답변

3

, 나는 모든 .flac 파일 목록에 확장됩니다 globstar을 사용하십시오. 당신이 그 중 하나도 가지고 있지 않다면 아마 이것을 건너 뛸 수 있습니다.

nullglob 쉘 옵션을 사용하도록 설정 했으므로 파일과 일치하지 않는 패턴이 아무 것도 아닌 것으로 확장되어 루프가 실행되지 않습니다.

+0

그러면 플러스 원 ':)'을받을 자격이 있습니다. –

2

find을 사용하고 싶다면 (예 : Bash의 골동품 버전으로 과거에 붙어있어 globstar을 사용할 수 없음 - Tom Fenech의 솔루션을 사용할 수 없음), 쉘을 사용하여 대체를 수행하십시오.

find . -name '*.flac' -type f -exec sh -c 'ffmpeg -i "$1" -c:a mp3 -b:a 320k "${1%.flac}.mp3"' dummy {} \; 

sh -c는 첫 번째 인수를 실행하고, 서브 시퀀스 인수는 0에서 시작하는 위치 매개 변수 으로 설정 : 표준 방법이 될 것입니다. 그래서 더미 매개 변수를 넣었습니다. (그리고 나는 dummy이라고했지만 다른 것은 할 수있었습니다).

find-name에있는 인수 *.flac은 따옴표로 묶어야합니다. 어떤 이유로 귀하는 귀하의 게시물을 편집하여 -name 술어를 -regex 술어로 바 꾸었습니다. 그것은 정말로 쓸모가 없으며 여전히 인수를 인용해야합니다.

+0

"sh -c"ffmpeg -i "$ 0"-c : mp3 -b : 320k "$ {1 % .flac} .mp3" '{} \;'을 쓸 수 없습니까? –

+1

@mona_sax : nope , 그 경우에는 위치 매개 변수 '$ 1'이 (가) 설정되지 않았으므로 유효하지 않습니다! 아마도'sh -c 'ffmpeg -i "$ 0"-c : mp3 -b : 320k "$ {0 % .flac} .mp3"'{} \;'을 의미 할 것입니다. –

+1

그래 그래! 네가 방금 지적한 바가 아니야. :). 나는 더미 변수를 사용하지 않기를 원했다. 이것은 실제로 우아한 하나의 라이너입니다. +1 –

관련 문제