`find -!?에서 빼기 기호(-)의 용도는 무엇입니까? -exec`서비스?

`find -!?에서 빼기 기호(-)의 용도는 무엇입니까? -exec`서비스?

존재하다이 답변-!, in 의 용도는 무엇입니까 find?

다음 코드를 고려해보세요.

find . -type l -! -exec test -e {} \; -print

이 대안은 동일한 작업을 수행하는 것 같습니다.

find . -type l ! -exec test -e {} \; -print

-!처럼 보이는 !것은 다음 표현의 부정을 의미합니다. 이것은 의미가 있습니다. 그런데 왜 !그때만은 안 되나요? 그러한 구문에 대한 문서를 찾을 수 없는 것 같습니다.

답변1

-!표준 연산자 이외의 구두점 연산자를 허용하는 것은 GNU find의 명령줄 구문 분석기의 특이한 점입니다 (다른 구두점 연산자( , 및 GNU 전용 연산자 ) !에도 동일하게 적용됩니다 ). 코드가 기형과 같은 경우를 거부하지 않으면 작성하기가 약간 더 쉬울 것입니다. 그렇지 않으면 오류가 발생 하므로 이를 수락하는 데 아무런 해가 없습니다. POSIX 표준은 이것이 무엇을 의미하는지 말하지 않습니다 . 표준에 관한 한 이는 구현에 의해 정의된 술어이며 구현에서는 이를 자유롭게 사용하여 원하는 것을 의미할 수 있습니다.(),-!-!-!

다음은 GNU find의 코드 작동 방식에 대한 개요입니다.

  • 파서 코드에는운영자 목록. 연산자는 -코드를 약간 더 작고 빠르게 만들기 위해 선도 없이 저장됩니다 .
  • 이것명령줄 파서수신 전화looks_like_expression인수가 술어처럼 보이는지 여부를 결정합니다. -단일 구두점 문자 연산자를 제외하고 술어는 로 시작합니다 .
  • 일단 술어가 결정되면,find_parser-선행이 있으면 무시하십시오 . 여기서 !와 의 차이가 -!사라집니다.

looks_like_expression또는 find_parser거부 -뒤에 구두점이 올 수도 있습니다. 그러나 어느 쪽이든 실질적인 이점 없이 추가 코드가 필요합니다.

답변2

이것-! 예제에서 "링크가 아닌 모든 항목 나열"을 의미하는 "-type l" 표현을 부정합니다.

-type l은 "file"이 링크인 경우에만 true가 됩니다. -!

찾기 맨페이지에서:

The POSIX standard specifies parentheses `(', `)', negation `!' and the `and' and `or' operators ( -a, -o).

빼기 기호는 옵션 구분 기호입니다. 다른 명령과 마찬가지로 각 옵션은 빼기 기호로 구분됩니다(예: ls -l). 느낌표(!)의 의미를 바꾸지는 않습니다.

관련 정보