서브쉘 find -exec
에 여러 인수를 전달하는 방법이 있습니까 ?bash -c
이 작업 호출이 주어지면 "*dogs.mp4
glob 패턴(예:)과 일치하는 모든 비디오를 검색한 다음 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 -c
from -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 {} +