-iname 조건 찾기 및 부정

-iname 조건 찾기 및 부정

이름에 "pillar"가 포함되어 있고(대소문자 구분) "cache"가 포함되어 있지 않은(대소문자 구분) 모든 파일을 찾으려고 합니다.

find . -iname '*pillar*' -and -not -iname '*cache*'

하지만 내가 찾은 것과는 다르게 작동하지 않습니다.

./Caches/Metadata/Safari/History/https:%2F%2Fwww.google.ch%2Fsearch?q=pillars+of+eternity+dropbox&client=safari&rls=en&biw=1440&bih=726&ei=CnBDVbhXxulSnLaBwAk&start=10&sa=N%23.webhistory

내가 뭘 잘못했나요?

답변1

지정한 옵션은 find하위 디렉터리 이름이 아닌 파일 이름에 적용됩니다.

여기에서 파일 이름에는 cache가 포함되어 있지 않으므로 pillar일치합니다.

귀하의 경우에는 이 옵션을 사용할 수 있습니다 -path. 그것은 다음과 같습니다:

find . -iname '*pillar*' -and -not -ipath '*cache*'

답변2

*cache*디렉토리에서 파일을 찾는 대신 *pillar*이름에 이름이 있거나 없는 파일을 찾으려 는 것 같습니다 . *cache*그런 다음 디렉터리 find에 들어가지 않도록 지시합니다.*cache*

find . -iname '*cache*' -prune -o -iname '*pillar*' -print

또는 다음을 사용하여 zsh -o extendedglob:

ls -ld -- (#i)(^*cache*/)#*pillar*

(보고 문서와 엄밀히 동일하지는 않음 foo/pillar-cache)

또는 (전체 트리를 내려가기 때문에 덜 효율적입니다.@apaul의 솔루션):

ls -ld -- (#i)**/*pillar*~*cache*

특정 글로브 에 대한 zsh세부정보 :

  • (#i): 대소문자를 구분하지 않는 일치 활성화
  • ^: 전역 연산자를 무효화
  • (...):그룹 (예: @(...)) ksh.
  • <something>#: 0개 이상 <something>(예: *정규식)
  • ~: and-not 연산자(전체 경로와 일치)
  • **/: 0개 이상의 디렉터리 수준(약어로 표시 (*/)#).

(D)숨겨진 디렉터리로 이동하여 숨겨진 파일을 일치시키려면( find솔루션에 표시된 대로) glob 한정자를 추가하세요.

관련 정보