특정 디렉토리에서“locate”를 사용 하시겠습니까?


46

"locate"의 검색 범위를 일부 디렉토리로 제한하는 방법이 궁금합니다.

예를 들어, "/ home / tim / science /"디렉토리 아래에 이름이 "math"인 파일 / 디렉토리를 찾는 방법은 무엇입니까?

감사합니다.

답변:


30

업데이트 : locate의 인수와 관련 하여 locate의 regex 옵션 과 쉘의 파일 이름 확장 에 대한 참고 사항 ...

SHELL FILENAME EXPANSION
입력 할 때 locate /bin/b*(따옴표가 없음) 몇 가지 일이 발생합니다.

  1. 먼저, 쉘 파일명 확장은 특수 쉘 패턴 문자를 확장합니다 * (*는 보호되지 않기 때문에, 즉 "큰 따옴표"가 없습니다)
  2. 이 확장 결과 는 파일 이름 목록입니다 . 이 목록은 아마도 매우 길다 ...이리스트는 locate많은 개별 커맨드 라인 인자로 전달된다 .
  3. locate 그런 다음 각 인수를 데이터베이스의 각 파일에 대해 테스트하고 일치하는 결과를 출력합니다.

그러나 'locate'에는 현재 작업 디렉토리의 개념이 없습니다. 데이터베이스의 정규화 된 파일 이름에 대해서만 arg를 일치시킵니다 .
이 모두 일치하는 것으로이 수단 /bin/bash /home/user/bin/brackets
당신이 통제 어느 정도이 방법이 있지만,의 위치를 정규식 검색 또한 제공을; 다른 찾기 옵션도 마찬가지입니다.

LOCATE 'S REGEX OPTION
입력 할 때 locate -r "/bin/b.*"간단한 인수와 다른 일이 발생합니다. ( shell-expanded-args 는 단순한 인수의 목록입니다)

  1. -r옵션은 찾기 를 통해 arg를 정규식 패턴으로 처리합니다.
  2. 인용 부호는 *를 쉘 파일 이름 확장에서 보호합니다. * 및 점을 의미합니다. 이제 특수 정규식 문자입니다
  3. 정규 표현식이기 때문에 다양한 방법으로 데이터베이스 항목과 일치하도록 'locate'를 쉽게 알 수 있습니다. eg1. / bin / b ... eg2로 locate -r "^/bin/b.*"시작하는 파일 이름을 생성합니다 . / home / user / bin / b로 시작하는 파일 이름을 생성합니다 . ~ /는 "따옴표"로 보호 되지 않으므로 ~ /를 / home / user /로 변환 하는 쉘 물결표 확장에 종속됩니다.locate -r ~/"bin/b.*"

요약 : "shell filname expansion"은 'regex'와는 상당히 다릅니다

이제 원래 게시물로 돌아갑니다.


locate 일반적으로 전체 데이터베이스를 stdout으로 나열하므로 필터링해야하는 특정 디렉토리로 제한하기 위해 ... 찾기의 옵션을 통해이를 수행 할 수 있습니다.

쉘 글 로빙보다는 찾기의 정규 표현식 기능을 사용할 수 있습니다 ... ( locate /dir/myfile* 쉘 글 로빙입니다) ...

에서 정보를 찾을 수 : -r,--regex

  • "... (정규식) 일치는 전체 경로 이름에 대해 수행되므로 기본적으로 경로 이름 중 일부가 지정된 정규식과 일치하면 일치합니다. 정규식은 ^ 또는 $ 를 사용 하여 경로명의 시작 또는 끝. "

주의 : -i =이 사건을 무시한다
. . . . . -r = 정규식
. . . . . ~ /는 쉘에 의해 / home / user로 확장됩니다 (~ /가 따옴표가 아닌 경우)
. . . . . '\' (baskslash + space; 따옴표 없음)는 리터럴 공백입니다 (쉘 확장을 피하기 위해). 문자열을 따옴표로 묶을 수 있지만 ~ / 는 따옴표 밖에 두어야 합니다. ~/my\ regex또는-/"my regex"

예. locate -ir ~/".*"la\ bella\ vitalocate -ir ~/".*la bella vita""La Bella Vita"에 대한 전체 홈 디렉토리와 동일하며 어디에서나 발생합니다.

검색을 파일 이름 으로 만 제한 할 수 있지만 -b또는 --basename..을 사용 하여 정규식 줄 시작 ^이 기본 이름에만 적용됩니다.

가장 일반적으로 locate -bir

PS .. Locate는 너무 빠르기 때문에 결코 사용 하지 않았습니다find ... 노틸러스 검색을 사용하지 않았습니다 (너무 느립니다)

'locate'를 사용하면 새로 추가 된 것을 찾고 있다면 sudo updatedblocate의 데이터베이스를 새로 고치기 위해 실행하십시오 ...


13

이처럼 grep을 통해 파이프

$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless

편집 : 다른 대답이 더 낫습니다. 패턴을 찾아서 찾을 수 있다는 것을 몰랐습니다.


@Adam .. 당신의 방법을 과소 평가하지 마십시오; 꽤 괜찮지 만 grep에 파이핑하는 대신 locate 자신의 정규 표현식을 사용할 수 있습니다. 참조하는 "다른"방법은 정규 표현식을 사용하지 않으며 매우 다르게 동작합니다 .... 차이점에 대한 자세한 내용을 answer ...
Peter.O

2
덜 찾기 | grep ^ / bin은 locate -r ^ / bin /.* less보다 훨씬 빠릅니다. locate less는 단어 less를 효율적으로 검색하고 locater -r은 locatedb의 모든 항목에 대해 정규식 연산을 수행합니다.
Marcel Valdez Orozco

@MarcelValdezOrozco "단어에 대한 효율적인 검색"이란 무엇이며 왜 정규 표현식보다 더 빠릅니까?
Flashrunner

때문에 @Flashrunner는 locate않는 O(log(n))이상 검색 locatedb당신은 그것을 비 정규식 검색 쿼리를 줄 때를, 당신은 사용할 수 있습니다 grep수행의 정규식을 O(m)이미 감소 하위 결과를 통해 검색을. (n = locatedb[예 : 모든 드라이브 파일]에 있는 총 항목 수 , m =에 적은 수의 항목 수 locatedb), 총 실행 복잡도 : O(log(n)) + O(m), 여기서 m은 평균 log(n)이므로 수행 할 때 2*O(log(n))와 달리 O(n)모든 항목에 걸쳐 정규식 쿼리 locatedb.
Marcel Valdez Orozco

@MarcelValdezOrozco 그러나 왜 정규 표현식 검색이 아닌 동안 db를 통한 정규 표현식이 아닌 O(log(n))검색 O(n)입니까? db의 항목 수는 각 경우에 동일합니다. 검색 알고리즘이라고 생각합니까?
Flashrunner

8

당신은 사용할 수 있습니다 locate /rootpath/*filenamespec. 나는 전에 시도하지 않았지만 작동하는 것처럼 보입니다. 당신의 모범을 보이기 위해서는locate /home/tim/science/*math*

이런 종류의 행동 find보다는 명령 을보고 싶을 수도 locate있습니다. 구문은 다음과 같습니다 find rootforsearch -name filenamepattern -print. 이 경우 예제에는 find /home/tim/science -name *math* -print. 검색 할 데이터베이스가없는 것만 큼 빠르지 않습니다. 실제로 파일 시스템을 검색합니다. 실제로 파일로 작업하려는 경우 인쇄 이외의 다른 옵션을 사용할 수 있습니다.


이것은 locate자체적 으로 사용 하고 (와 같은 다른 유틸리티 grep가 필요하지 않음) 정규 표현식없이 (이 경우에는 좋지만 불필요한) 최상의 답변 입니다.
Tom

@Nerdfest
amit_game

1

나에게 가장 편리한 것은

cd /home/tim/science
locate math | grep `pwd`

질문을 정말로 읽었습니까?
Tessaracter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.