txt 찾기와 *.txt 찾기의 차이점은 무엇입니까?

txt 찾기와 *.txt 찾기의 차이점은 무엇입니까?

출력 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.txtand 가 포함되어 있으면 b.txt결국 It을 실행하게 됩니다. 구현에 따라 및 또는 가 포함된 경로를 locate a.txt b.txt찾습니다 . a.txt예를 들어 경로는 첫 번째 범주의 경로처럼 보이고 아마도 내부에서 명령을 실행하고 있을 것입니다.b.txtlocate/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.txtb.txtlocate *.txtlocate a.txt b.txtlocate '*a.txt*' '*b.txt*'

관련 정보