확장명 이름을 바꾸려고 할 때 교체 오류가 발생했습니다. [중복]

확장명 이름을 바꾸려고 할 때 교체 오류가 발생했습니다. [중복]

모든 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호출되고 findit( 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참 좋은 이름인 것 같아요 .

관련 정보