이름에 "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 한정자를 추가하세요.