bashrc에 "find exec" 명령을 함수로 어떻게 추가하나요?

bashrc에 "find exec" 명령을 함수로 어떻게 추가하나요?
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 {} \;
}

관련 정보