이름 찾기는 어떻게 작동하나요?

이름 찾기는 어떻게 작동하나요?

나는 평생 동안 find테스트가 어떻게 -name작동하는지 알아낼 수 없습니다.

실행하면 find / -name *in다음과 같은 결과가 반환됩니다.

/sbin
/sbin/sulogin
/dev/stdin

몇가지 말하자면.

이는 파일 이름 확장을 수행하는 것과 같지만 이는 쉘이 명령을 실행하기 전에 발생하므로 그럴 수 없습니다. 또한 현재 디렉토리에 일치하는 파일이 없기 때문입니다 *in. 또한 작은따옴표는 *in동일한 결과를 생성하며 이는 파일 이름 확장자가 될 수 없다는 추가 증거입니다.

문서에 따르면 findwith는 -name정규식을 사용하지만 정규식 패턴은 *in위에 표시된 결과와 일치하지 않습니다.

누군가 나를 깨달을 수 있습니까?

답변1

전달된 인수는 -name파일 시스템입니다.전반적인 상황모드는 다른 명령에 입력하는 것과 동일합니다 ls -l *in.

발견된 각 파일에 대해 비교합니다.기본 이름전달한 스키마에 파일을 추가합니다. 따라서 일치하지 않는 것을 비교하면 /bin/foobar건너 foobar뛰지 *in/bin/login비교 login하면 *in일치하므로 인쇄됩니다.

*in이제 현재 디렉터리의 파일을 기반으로 명령줄에 일치 항목이 있을 수 있으므로 주의해야 합니다 .

예를 들면 다음과 같습니다.

$ find /bin -name *in
/bin
/bin/login

$ touch foobarin

$ find /bin -name *in
$ 

동일한 find명령이 두 가지 다른 결과를 반환한다는 점에 유의하세요.

셸을 디버그 모드로 설정하면 그 이유를 알 수 있습니다.

$ rm foobarin 

$ set -x

$ find /bin -name *in
+ find /bin -name '*in'
/bin
/bin/login

$ touch foobarin     
+ touch foobarin

$ find /bin -name *in
+ find /bin -name foobarin

$ 

a로 시작하는 줄은 +입력된 명령에 대한 쉘의 해석입니다. 두 번째 명령이 기존 파일 이름과 일치하도록 find확장되는 것을 볼 수 있습니다 .*in

이 때문에 권장됩니다.인용하다이름

$ find /bin -name '*in'
+ find /bin -name '*in'
/bin
/bin/login

관련 정보