이름이 또는 로 끝나는 많은 파일이 dir1
포함된 디렉토리가 있습니다 . 빈 파일을 모두 복사하고 싶습니다 ..jpg
.png
.png
dir2
이 명령의 작동 방식:
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 버그라는 것이 발견되었습니다.