"find -exec"에서 "bash -c" 하위 쉘로 여러 인수를 전달하는 방법은 무엇입니까?

"find -exec"에서 "bash -c" 하위 쉘로 여러 인수를 전달하는 방법은 무엇입니까?

서브쉘 find -exec에 여러 인수를 전달하는 방법이 있습니까 ?bash -c

이 작업 호출이 주어지면 "*dogs.mp4glob 패턴(예:)과 일치하는 모든 비디오를 검색한 다음 ffmpeg하위 셸에서 실행하여 파일이 이미 존재하는지 확인하고 경고합니다.

find . -iname "*.mp4" -exec bash -c 'if [[ -f "${1%.*}_540.mp4" ]]; then echo "Already exists: $1"; else ffmpeg -i "$1" -vf "scale=540:-1" "${1%.*}_540.mp4" ; fi ;' _ {} +

540크기를 하드코딩하는 것을 피하기 위해 나중에 $2크기를 매개변수로 전달하여 명령이 다음과 같이 되도록 했습니다 {}._ {} 540 +

find . -iname "*.mp4" -exec bash -c 'if [[ -f "${1%.*}_$2.mp4" ]]; then echo "Already exists: $1"; else ffmpeg -i "$1" -vf "scale=%2:-1" "${1%.*}_%2.mp4" ; fi ;' _ {} 540 +

위 줄에서 오류가 발생했습니다 find: -exec: no terminating ";" or "+". ::

제가 이해한 바에 따르면 이는 {}파일 이름에 대한 자리 표시자 {} +이거나 {} \;명령 끝에 있어야 합니다.

이 경우 bash -cfrom -exec절에 추가 매개변수를 어떻게 전달할 수 있나요?

답변1

넌 논쟁을 할 수 없어뒤쪽에{}를 사용 하고 있다면 +확인해 보세요.사양:

-exec ... 두 문자 "{}"만 포함하는 인수 바로 뒤에 있는 더하기 기호만 기본 표현식의 끝을 강조합니다. 더하기 기호의 다른 용도는 특별한 용도로 간주되어서는 안 됩니다.

또한 (+ 사용) 여러 인수를 셸에 전달하지만 $1그 인수만 사용하면 발견된 나머지 파일을 무시하게 됩니다. 쉘 명령에 루프를 넣어야 합니다. 바라보다https://unix.stackexchange.com/a/321753/135943몇 가지 예를 들자면 일반적으로 다음과 같습니다.

find dirname ... -exec sh -c 'for f do somecommandwith "$f"; done' placeholder {} +

그럼에도 불구하고 크기를 "하드코딩"하고 있습니다. 실제 쉘 명령에 하드코딩할 수도 있습니다. 이는 마지막 인수 목록에 하드코딩하는 것보다 쉽습니다. 하지만 고집하면 통과할 수 있어요540 바꾸다밑줄(예: 위 명령에서 "자리 표시자" 교체)을 입력하고 $0셸 명령 내부에서 액세스하세요.


발견된 모든 파일을 전달하고 루프에서 처리하려는 경우 명령에 포함된 셸 명령에 추가 매개변수를 전달하는 방법에 대한 보다 일반적인 질문에 대해서는 find ... -exec다음을 수행할 수 있습니다.

find dirname ... -exec sh -c 'arg1="$1"; arg2="$2"; shift 2; for f do somecommandwith "$f" "$arg1" "$arg2"; done' placeholder firstextraarg secondextraarg {} +

하지만 진짜 질문은,왜 이 일을 하고 싶나요? "firstextraarg" 및 "secondextraarg" 값을 쉘 명령에 직접 입력하는 것이 더 쉽습니다.

find dirname ... -exec sh -c 'for f do somecommandwith "$f" firstextraarg secondextraarg; done' placeholder {} +

관련 정보