출력 locate txt | head
:
/etc/brltty/brl-ba-all.txt
/etc/brltty/brl-bd-all.txt
/etc/brltty/brl-bl-18.txt
/etc/brltty/brl-bl-40_m20_m40.txt
/etc/brltty/brl-ec-all.txt
/etc/brltty/brl-ec-spanish.txt
/etc/brltty/brl-eu-all.txt
/etc/brltty/brl-lb-all.txt
/etc/brltty/brl-lt-all.txt
/etc/brltty/brl-mb-all.txt
출력 locate *.txt | head
:
/home/abc/capital.txt
/home/abc/state.txt
출력에 왜 이렇게 큰 차이가 나는 걸까요? 두 번째 명령은 내 홈 폴더만 확인하는 것 같지만 첫 번째 명령은 많은 디렉터리를 확인하는 것 같습니다. 왜 이런 일이 발생합니까?
답변1
locate txt
경로에 1 이 포함되어 있는 모든 파일(일반 파일, 심볼릭 링크, 디렉터리, 소켓 등을 포함한 모든 유형)을 찾습니다. txt
따라서 , 등이 포함됩니다 /foo/xtxty/bar
./foo/bar.txt
/foo/txt.bar
locate *.txt
*
는 인용되지 않았기 때문에 잘못된 것이므로 *.txt
쉘은 먼저 패턴과 일치하는 현재 디렉토리의 모든 파일 이름으로 확장하고 결과를 에 전달합니다 locate
. 예를 들어 현재 디렉토리에 a.txt
and 가 포함되어 있으면 b.txt
결국 It을 실행하게 됩니다. 구현에 따라 및 또는 가 포함된 경로를 locate a.txt b.txt
찾습니다 . a.txt
예를 들어 경로는 첫 번째 범주의 경로처럼 보이고 아마도 내부에서 명령을 실행하고 있을 것입니다.b.txt
locate
/foo/da.txtob.txt
/home/abc
현재 디렉터리에 파일이 없으면 .txt
셸에 따라 오류가 발생하거나 리터럴 인수 locate
로 호출됩니다.*.txt
항상 locate
원하는 리터럴로 호출 하려면 쉘에 대해 해당 리터럴을 인용 *.txt
해야 합니다 . Bourne과 같은 쉘에서 또는 백슬래시를 사용하는 경우 Bourne의 모든 내용을 인용하므로 작은따옴표가 가장 좋습니다. 문자는 쉘입니다. 다음과 같은 쉘은 가장 이식성이 뛰어납니다.*
"..."
'...'
locate '*.txt'
그런 다음 인수에 와일드카드( *
) 가 포함되어 있으므로 locate
하위 문자열 검색에서 패턴 일치 검색( find -name
셸 또는 기타 인식된 검색과 동일)으로 전환하고 패턴과 일치하는 모든 파일 경로, 즉 , 또는 path .txt
로 반환합니다. ./foo/.txt
/foo/bar.txt
locate
표준 명령은 아니며 호환되지 않는 구현이 많이 있지만 위의 간단한 동작은 전부는 아니더라도 대부분의 경우에 공통됩니다. 대부분의 구현은 다양한 일치 항목에 대한 다양한 옵션을 지원합니다. 다양한 구현 및/또는 버전이 매우 잘 문서화되어 있을 수 있으므로 인터넷의 임의 페이지보다는 자신의 locate
문서를 확인하십시오.man locate
1 위치 데이터베이스가 마지막으로 업데이트되었을 때 존재했습니다.
답변2
<command> *.txt
예를 들어 ()와 같은 와일드카드를 사용하면 실행 중인 명령이 아닌 셸에서 확장이 수행됩니다. 이 경우에는 그렇습니다 locate
.
실행 중인 명령에 와일드카드 문자가 전달되도록 하려면 해당 문자를 따옴표로 묶으십시오.
locate "*.txt"
또는 다음을 사용하여 이스케이프하십시오 \
.
locate \*.txt
또한 locate
정규식을 어느 정도 기반으로 하는 일치 알고리즘이 있지만 완전히는 아닙니다. 을 검색하면 반드시 끝에 있을 필요는 없지만 파일 이름의 일부로 포함되기를 txt
원한다고 가정합니다 .txt
너할 수 있는강제 정규식 처리:
locate -r "txt$"
자세한 내용은 다음을 참조하세요.locate
매뉴얼 페이지
답변3
locate
필요무늬매개변수로. 인용되지 않았기 때문에 *.txt
쉘은 그대로 전달하는 대신 먼저 확장을 시도합니다.
또한 다음 사항에 유의하세요.
특별한 경우로, 와일드카드 문자("foo")를 포함하지 않는 패턴은 "*foo*"와 같이 일치됩니다.
따라서 현재 디렉토리에 and 만 포함되어 있다고 가정하면 으로 확장되므로 와 동일 locate txt
합니다 .locate '*txt*'
a.txt
b.txt
locate *.txt
locate a.txt b.txt
locate '*a.txt*' '*b.txt*'