-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 ...] {} +
...두 문자 ""만 포함하는 인수 바로 뒤에 있는 <더하기 기호>만
{}
주 표현식의 끝을 강조합니다. <더하기 기호>의 다른 용도는 특별한 용도로 간주되어서는 안 됩니다.
즉, 사용되면 +
명령은필요으로 끝나다 {} +
.
왜 이런거야? 왜 +
대신에 the를 사용합니까 ;
? 처음에는 가 포함된 파일 이름과의 충돌을 피하기 위한 것이라고 생각했지만 가 +
포함된 파일 이름은 ;
제대로 작동하는 것 같습니까? 이 제한이 임의적이라고 믿기 어렵습니다 ...
답변1
이것이유POSIX 사양에 제공된 내용은 다음과 같습니다.
사용된 구문은
"-exec ... {} +"
IEEE PASC 해석 1003.2 #210의 결과입니다. 이는 ISO/IEC 9899:1999 표준과 호환되지 않는 변경 사항이라는 점에 유의해야 합니다. 예를 들어,'-'
다음 명령은 일반 파일인 경우 파일 뒤에 이름이 있는 모든 파일을 인쇄하고,'+'
그렇지 않으면 인쇄합니다.find / -type f -exec echo {} - ';' -o -exec echo {} + ';'
이 변경으로 인해 그러한 사용이 무효화됩니다. 이전 표준에서는 이러한 사용이 허용된다고 명시되어 있었지만 실제로는 많은 사람들이 이를 지원하지 않았으며 표준 개발자는 지금은 허용되지 않는다고 명시하는 것이 최선이라고 생각했습니다.
PASC 설명 1003.2 #210역사에 대해 더 자세히 알아보세요 -exec … {} +
. POSIX에서 채택되기 전에 여러 Unix 시스템에 존재했습니다.SVR4(기본적으로 문서화되지 않았습니다). 버그 보고서에 따르면 호환되지 않는 변경 사항은 실제로 거의 영향을 미치지 않습니다.
"{}" 바로 다음의 "+"만 특수 문자로 간주됩니다. 이는 "-exec" 인수로 "+"를 사용하여 발생하는 기존 문제의 가능성을 최소화합니다.
지원을 추가하면 -exec … {} +
일부 호환 애플리케이션(예: 위의 예)이 중단되지만 이러한 애플리케이션의 수는 -exec … {} … +
허용되는 것보다 적습니다.
아마도 {}
마지막 주장으로 제한하는 또 다른 이유는 구현의 용이성 때문일 것입니다. {}
매개변수 목록의 어디에서나 to가 허용되는 경우 프로그램은 정적 매개변수, 변수 섹션, 또 다른 정적 섹션을 복사하여 명령줄을 작성해야 합니다 -exec
. find
이로 인해 매개변수 목록을 작성하고 크기 제약 조건을 고려하는 것이 더 어려워집니다. 난이도는 미미하지만 구현자는 지름길을 선호합니다. 여러 대체 가능한 인스턴스를 지원하는 것은 {}
( -exec {} foo +
가능하고 논리적으로 -exec {} foo {} +
예상되는 경우) 더 어려울 것입니다.