"-exec cp {} dir +"를 허용하지 않는 이유는 무엇입니까?

"-exec cp {} dir +"를 허용하지 않는 이유는 무엇입니까?

이름이 또는 로 끝나는 많은 파일이 dir1포함된 디렉토리가 있습니다 . 빈 파일을 모두 복사하고 싶습니다 ..jpg.png.pngdir2

이 명령의 작동 방식:

find dir1 -name '*.png' -exec cp {} dir2 \;

하지만 이 명령은 다음을 수행하지 않습니다.

find dir1 -name '*.png' -exec cp {} dir2 +
find: missing argument to `-exec'

나는 또한 다음을 시도했습니다.

find dir1 -name '*.png' -exec cp {} -t dir2 +
find: missing argument to `-exec'

그리고:

find dir1 -name '*.png' -exec cp {} dir2 \+
find: missing argument to `-exec'

읽고 나서이 페이지, 나는 심지어 다음을 시도했습니다.

find dir1 -name '*.png' -exec cp {} dir2 {} +
find: Only one instance of {} is supported with -exec ... +

이 페이지설명하다:

-exec {} + 2005년 [버전] 4.2.12에 추가됨

내 버전 find은 4.4.2입니다.

내가 뭘 잘못했나요?

답변1

{}"steeldriver" 덕분 에 나는 POSIX +사양 이 -exec.

답변2

이 문제에 대한 POSIX 호환 솔루션이 확실히 있습니다.

find dir1 -name '*.png' -exec sh -c 'cp "$@" dir2' null {} +

비표준 공급업체별 기능을 사용할 필요가 없습니다.

참고: 제가 아는 한, execplus 기능은 David Korn이 1989년 SVr4 작업 중에 도입했습니다. 중요한 배경 정보: POSIX는 새로운 기능을 정의하지 않고 기존 솔루션만 표준화하므로 POSIX 표준이 주요 솔루션과 충돌하는 경우 POSIX는 일반적으로 잘못된 것입니다.

유명한 최근 예: 1989년 SVr4에서도 도입된 waitid()는 종료 코드의 모든 32비트가 상위 프로세스에서 사용 가능해야 함을 정의합니다. SUSv2 표준(1997년부터)은 정확하지만 알 수 없는 이유로 이후 버전에서는 종료 코드를 0xFF로 마스크해야 한다고 언급합니다. 최근 이것이 POSIX 버그라는 것이 발견되었습니다.

관련 정보