find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \;
위 명령을 수동으로 실행하면 제대로 작동하지만 .bashrc
파일의 함수에 넣을 수는 없습니다. 오류를 수신합니다 unexpected end of line
.
function fff { find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \; }
답변1
귀하의 의견에 제공한 함수 정의는 다음과 같습니다.
function fff { find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \; }
}
함수 정의를 종료해야 하는 세미콜론 또는 개행 문자가 앞에 누락되었습니다. 이스케이프된 세미콜론은 중요하지 않습니다. 단지 기본을 find
끝내라는 인수일 뿐입니다. -exec
이것은 작동합니다:
function fff { find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \; ; }
# semicolon here: ^^^
...하지만 여전히 몇 가지 문제가 있습니다. 첫째, @Kusalananda가 주석에서 말했듯 {}
이 파일 이름을 쉘 명령에 직접 삽입하는 것은 안전하지 않습니다. 이를 인수로 전달하여 사용해야 합니다 "$1"
. 이미 그렇게 했지만 $0
-- 이것은 실제로 일반 매개변수가 아닌 명령/함수/등의 이름이어야 하므로 다른 매개변수(예: find-bash
)를 로 전달 $0
하고 실제 매개변수를 로 두는 것이 좋습니다 $1
.
두 번째로(@Kusalananda가 다시 지적함), ${1/.mov}
파일 이름의 다른 곳에 ".mov"가 있는 경우 이전 ".mov" 접미사 제거를 사용하면 제대로 작동하지 않을 수 있습니다 ${1%.mov}
.
세 번째(그리고 덜 중요한) function
는 많은 사람들이 피하고 싶어하는 비표준이라는 굴욕입니다 funcname() definition
. 저는 또한 명령을 구분하기 위해 세미콜론 대신 개행 문자를 사용하는 것을 좋아합니다. 이 모든 수정을 거친 후에는 다음과 같은 결과를 얻었습니다.
fff() {
find . -name "*.mov" -exec bash -c 'echo ffmpeg -i "$1" -c:v libx264 -crf 20 -pix_fmt yuv420p "${1%.mov}.mp4"' find-bash {} \;
}