찾기 및 grep 파이프라인을 사용하여 경로 이름으로 파일 검색이 향상되었습니다.

찾기 및 grep 파이프라인을 사용하여 경로 이름으로 파일 검색이 향상되었습니다.

locatefindutils나는 종종 다음과 같은 (from ) 파이프를 사용하여 경로 이름에 특정 순서가 아닌 grep두 단어 및 가 포함된 word1파일을 찾습니다.word2

locate -i word1 | grep -i  word2

파이프라인이 아닌 단일 명령만 사용하여 이 작업을 수행하는 방법이 궁금합니다. 이것이 내 파이프 명령보다 더 나은 접근 방식입니까?

locate검색 패턴을 공식화할 수 있는 일부 정규 표현식이 지원 됩니까 ?

감사해요.

해결책 findhttps://unix.stackexchange.com/a/448006/674

답변1

이는 구현에 따라 크게 달라집니다 locate.이는 표준 명령이 아니며 구현 방식에 따라 상당한 차이가 있습니다.

  1. GNU findutils에 구현이 있습니다.

    그것으로:

    locate -i word1 word2
    

    word1경로에 대소문자가 포함 되거나 word2대소문자를 구분하지 않는 파일 찾기

    locate -Ai word1 word2
    

    경로에 두 가지가 모두 포함된 파일을 찾습니다.

    또한 GNU와 유사한 --regex옵션도 지원합니다. 기본적으로 이는 BRE와 ERE 간의 일종의 하이브리드 형태인 -style 정규식입니다.--regextypefindemacs

    이를 통해 다음을 수행할 수 있습니다.

    locate -ir 'word1.*word2\|word2.*word1'
    
  2. 구현 mlocate(Debian 및 그 파생 제품의 기본 구현)또한 지원됩니다 -A. -r/ --regex는 있지만 --regextypeRE는 기본 정규식입니다. BRE가 대체 확장을 지원하는 GNU와 같은 시스템에서는 \|다음을 수행할 수도 있습니다.

    locate -ir 'word1.*word2\|word2.*word1'
    
  3. 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로 구분된 레코드를 사용할 수 있고 -0GNU 옵션과 함께 사용할 수도 있습니다.-zgrep

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/'

관련 정보