나는 평생 동안 find
테스트가 어떻게 -name
작동하는지 알아낼 수 없습니다.
실행하면 find / -name *in
다음과 같은 결과가 반환됩니다.
/sbin
/sbin/sulogin
/dev/stdin
몇가지 말하자면.
이는 파일 이름 확장을 수행하는 것과 같지만 이는 쉘이 명령을 실행하기 전에 발생하므로 그럴 수 없습니다. 또한 현재 디렉토리에 일치하는 파일이 없기 때문입니다 *in
. 또한 작은따옴표는 *in
동일한 결과를 생성하며 이는 파일 이름 확장자가 될 수 없다는 추가 증거입니다.
문서에 따르면 find
with는 -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