모든 wav 및 mp3 파일을 ogg 파일로 재귀적으로 변환하기 위해 find 및 FFmpeg를 사용하려고 합니다. 이를 위해 다음 bash 스크립트를 만들었습니다.
#!/usr/bin/env bash
# Converts samples to ogg
find samples \( -iname '*.wav' -o -iname '*.mp3' \) -execdir ffmpeg -i "$(basename "{}")" -qscale:a 6 "${$(basename "{}")%.*}.ogg" \;
그러나 이렇게 하면 오류가 발생합니다.
${$(basename "{}")%.*}.ogg: bad substitution
접미사가 붙은 파일의 기본 이름을 반환하도록 마지막 대체 항목의 형식을 어떻게 지정해야 합니까 .ogg
? 이것이 작동하지 않는 이유는 무엇입니까?
답변1
--execdir
(Bash) 쉘이 호출된 다음 ffmpeg가 호출된다고 가정하는 것 같습니다 . 그러나 실제로는 그렇지 않습니다.
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered. The string `{}'
is replaced by the current file name being processed everywhere
it occurs in the arguments to the command, not just in arguments
where it is alone, as in some versions of find.
ffmpeg
호출되고 find
it( ffmpeg
)은 특수 구문으로 무엇을 해야 할지 모릅니다.
입력 파일 이름만을 기반으로 하나의 변환을 처리하는 작은 bash 스크립트를 만들어 -execdir
.
답변2
나나는 최근에 예시를 썼다.쉘 원라이너를 find
명령에 채우는 것도 또 다른 사용 사례입니다.
바꾸다:
find samples \( -iname '*.wav' -o -iname '*.mp3' \) -execdir ffmpeg -i "$(basename "{}")" -qscale:a 6 "${$(basename "{}")%.*}.ogg" \;
노력하다:
find samples \( -iname '*.wav' -o -iname '*.mp3' \) -exec sh -c 'ffmpeg -i "$1" -qscale:a 6 "${1%.*}.ogg"' find-sh {} \;
이것은 find-sh
임의의 텍스트입니다. 쉘의 $0
. find-sh
참 좋은 이름인 것 같아요 .