locate
findutils
나는 종종 다음과 같은 (from ) 파이프를 사용하여 경로 이름에 특정 순서가 아닌 grep
두 단어 및 가 포함된 word1
파일을 찾습니다.word2
locate -i word1 | grep -i word2
파이프라인이 아닌 단일 명령만 사용하여 이 작업을 수행하는 방법이 궁금합니다. 이것이 내 파이프 명령보다 더 나은 접근 방식입니까?
locate
검색 패턴을 공식화할 수 있는 일부 정규 표현식이 지원 됩니까 ?
감사해요.
답변1
이는 구현에 따라 크게 달라집니다 locate
.이는 표준 명령이 아니며 구현 방식에 따라 상당한 차이가 있습니다.
GNU findutils에 구현이 있습니다.
그것으로:
locate -i word1 word2
word1
경로에 대소문자가 포함 되거나word2
대소문자를 구분하지 않는 파일 찾기locate -Ai word1 word2
경로에 두 가지가 모두 포함된 파일을 찾습니다.
또한 GNU와 유사한
--regex
옵션도 지원합니다. 기본적으로 이는 BRE와 ERE 간의 일종의 하이브리드 형태인 -style 정규식입니다.--regextype
find
emacs
이를 통해 다음을 수행할 수 있습니다.
locate -ir 'word1.*word2\|word2.*word1'
구현
mlocate
(Debian 및 그 파생 제품의 기본 구현)또한 지원됩니다-A
.-r
/--regex
는 있지만--regextype
RE는 기본 정규식입니다. BRE가 대체 확장을 지원하는 GNU와 같은 시스템에서는\|
다음을 수행할 수도 있습니다.locate -ir 'word1.*word2\|word2.*word1'
ast-open에는
locate
래퍼 스크립트와 ksh93 래퍼 스크립트tw
(한때 ast-open의 후속 스크립트find
) 가 있습니다..-A
nor 는 지원하지 않지만-r
와일드카드의 모든 기능을 사용할 수 있으므로ksh93
예를 들어 Perl과 같은 예측 연산자를 사용할 수 있습니다.locate '~(Pi:^(?=.*word1)(?=.*word2))'
Or
ksh93
에 대한&
전역 연산자 :locate -i '*word1*&*word2*'
이 모드는 고정되지 않지만 다른 모드에 비해 특히 느립니다. 앵커링(
l
왼쪽 및r
오른쪽)이 복원되면 훨씬 더 잘 작동합니다.locate -i '~(lr)*word1*&*word2*'
파이프 연결 문제grep
예, 개행 문자가 포함된 파일 경로에서는 작동하지 않습니다. 이 옵션을 GNUlocate 또는 mlocate와 함께 사용하면 NUL로 구분된 레코드를 사용할 수 있고 -0
GNU 옵션과 함께 사용할 수도 있습니다.-z
grep
locate -i0 word1 | grep -z word2 | grep -z word3 | tr '\0' '\n'
또는 -v RS='\0'
GNU gawk 또는 @ThomasDickey에서 mawk
:
locate -i0 word1 | awk -v RS='\0' '/word2/ && /word3/'
또는 perl -ln0
:
locate -i0 word1 | perl -ln0e 'print if /word2/ && /word3/'