서문 : -exec {} \;
& 의 차이점을 이해합니다 -exec {} +
. 나는 또한 문제가없는 등을 , 나는의 의미에 대한 그냥 궁금입니다 find
.
종료 할 때 -exec
함께 인수 +
하는 대신 ;
, 우리는 필요 로 이것을 종료 {} +
예를 들어, :
# FreeBSD find
$ find . -type f -exec cp {} /tmp +
find: -exec: no terminating ";" or "+"
# GNU find is even more cryptic:
$ find: missing argument to `-exec'
;
이 예제에서 사용 하는 대신 +
잘 작동합니다 (그러나 분명히 다른 일을합니다).
에서 POSIX :
-exec utility_name [argument ...] ;
-exec utility_name [argument ...] {} +
… 두 문자 ”
{}
” 만 포함하는 인수 바로 뒤에 오는 <plus-sign>만이 기본 표현식의 끝을 잘립니다. <plus-sign>의 다른 용도는 특별하게 취급되지 않습니다.
즉,를 사용할 때 +
명령 은 로 끝나야합니다 {} +
.
왜 이런거야? 왜 그런지 +
아닌지 ;
? 처음에는을 포함하는 +
파일 이름과의 충돌을 피할 수 있다고 생각 했지만 파일 이름이 ;
잘 작동 하는 것 같습니다. 이 제한이 임의적이라고 믿기가 어렵습니다 …
답변
근거 는 POSIX 사양에 주어진입니다 :
"-exec ... {} +"
채택 된 구문은 IEEE PASC Interpretation 1003.2 # 210의 결과입니다. 이는 ISO / IEC 9899 : 1999 표준과 호환되지 않는 변경 사항입니다. 예를 들어, 다음 명령은 모든 파일이'-'
이름이 일반 파일 인 경우 이름 뒤에 다른 파일을 인쇄합니다'+'
.find / -type f -exec echo {} - ';' -o -exec echo {} + ';'
변경하면 이와 같은 사용법이 무효화됩니다. 이전 표준에서이 사용법이 효과가 있다고 말했지만 실제로는 많은 사람들이이를 지원하지 않았으며 표준 개발자는 이것이 허용되지 않는다고 말한 것이 더 나았습니다.
PASC 해석 1003.2 # 210 의 역사에 대해 자세히 설명합니다 -exec … {} +
. POSIX에서 채택하기 전에 여러 유닉스 시스템에 존재했습니다. 결함 보고서는 SVR4 (대부분 문서화되지 않은)로 다시 추적합니다 . 결함 보고서는 실제로 거의 영향을 미치지 않는 호환되지 않는 변경을 정당화합니다.
“+”는 “{}”바로 뒤에 오는 경우에만 특수한 것으로 취급됩니다. 이렇게하면 “-exec”의 인수로 기존 “+”를 사용할 때 문제가 발생할 가능성이 최소화됩니다.
지원을 추가하면 -exec … {} +
위의 예와 같은 일부 응용 프로그램이 중단 되지만 -exec … {} … +
허용되는 것보다 적은 수의 응용 프로그램이 있습니다 .
아마도 {}
마지막 주장 으로 제한해야하는 또 다른 이유 는 구현의 용이성 때문입니다. 경우 {}
에 인수 목록의 아무 곳이나 허용되었다 -exec
의 find
프로그램은 정적 인수, 다음 변수 부분, 다음 다른 정적 인 부분을 복사하여 명령 줄을 구축해야합니다. 따라서 인수 목록을 구성하고 크기 제한을 설명하기가 더 어려워집니다. 어려움은 최소화되지만 구현자는 모서리를 자르는 것을 좋아합니다. 대체 가능한 여러 인스턴스를 지원하는 {}
경우 ( -exec {} foo +
논리적으로 예상되는 경우 논리적으로 기대할 수 있음 -exec {} foo {} +
) 훨씬 더 어려워집니다.