검색 패턴이 참조되지 않은 경우에도 목록 .log 파일을 반복적으로 찾는 이유는 무엇입니까?

검색 패턴이 참조되지 않은 경우에도 목록 .log 파일을 반복적으로 찾는 이유는 무엇입니까?

내가 사용하고 있는 find 명령은 일치하는 패턴이 참조되지 않는 경우에도 모든 .log 파일을 반복적으로 나열합니다. 내가 아는 한, 검색 패턴이 인용되지 않으면 쉘에 의해 확장되고 find 명령이 작동하며 현재 디렉토리의 .log 파일만 제공해야 합니다.

찾다. -iname *.log

답변1

대부분의 다른 POSIX 쉘은 glob이 어떤 파일과도 일치하지 않을 때 오류를 보고하지 않고 대신 glob 축어(확장되지 않음)를 응용 프로그램에 전달하기 때문에 아마도 이러한 쉘 중 하나를 사용하고 있을 것입니다. 숨겨진 파일 bash은 없습니다. .log현재 디렉터리에 확장명 포함).

그 껍질 중에서 당신은 찾을 수 있습니다

echo *.log

산출

*.log

다음과 같은 오류 대신:

zsh: no matches found: *.log`

fish: No matches for wildcard '*.log'. See `help expand`.
echo *.log

echo: No match.

.log따라서 현재 디렉터리에 파일이 없는 경우:

find . -name *.log

동일할 것이다

find . -name '*.log'

리터럴 *.log인수 중 하나가 에 전달됩니다 find.

이 문제를 해결한 쉘은 zsh, , csh최신 tcsh버전 이다 fish(사실 유닉스 이전 버전에서는 괜찮았으나 1970년대 후반 Bourne 쉘에서 깨졌다가 일부 쉘에서 다시 고쳐졌다). Pass 를 bash사용하면 shopt -s failglob더 나은 행동을 얻을 수 있습니다.

.log현재 디렉터리(예: )에 파일이 있으면 다음과 file.log같습니다.

find . -name file.log

둘 이상이 있는 경우(예: file1.logfile2.log)는 다음과 같습니다.

find . -name file1.log file2.log

이는 잘못된 호출이 됩니다 find.

답변2

쉘이 확장할 수 있는 것은초기점, 귀하의 경우에는 .검색 모드가 아닙니다.
따라서 설계된 대로 작동합니다.

다음 명령은 셸 확장을 수행합니다.

find *log 

이 명령 자체는 다음을 사용할 수도 있으므로 의미가 없습니다.

ls -1 *log

고쳐 쓰다

아래 의견에서 언급했듯이 쉘은 검색 패턴을 인용하는 역할을 담당합니다.
검색 패턴이 셸에 의해 확장된다는 것은 맞습니다. 그러나 이로 인해 종종 오류가 발생하게 됩니다. 이에 대한 내용은 맨 페이지의 리소스 섹션에 설명되어 find있습니다 NON-BUGS.

관련 정보