별표(*)가 앞에 붙은 경우 find가 일치하는 파일을 나열하지 않는 이유는 무엇입니까? [복사]

별표(*)가 앞에 붙은 경우 find가 일치하는 파일을 나열하지 않는 이유는 무엇입니까? [복사]

On에서는 현재 디렉토리로 Ubuntu 14.04, 64 bit설정했습니다 . 하위 문자열이 있는지 /lib/modules/4.2.0-27-generic/kernel/drivers모든 파일을 검색할 계획입니다 . net정규식을 사용하여 검색하면 디렉터리 *net*./net검색 결과로 반환됩니다. 그러나 정확한 파일 이름을 지정하면 관련 파일만 나열됩니다(교차 확인할 정확한 파일 이름을 항상 알 수 없기 때문에 쓸모가 없습니다).

$ find . -name *net* 
./net
$ find . -name *usbnet* 
./net/usb/usbnet.ko
$ pwd
/lib/modules/4.2.0-27-generic/kernel/drivers

내가 무슨 실수를 했나요?

답변1

*net*인용이나 이스케이프 없이 그냥 사용하면 쉘은 명령이 실행 net되기 전에 현재 디렉토리의 (기존) 파일/디렉토리로 명령을 확장 하기 때문입니다 find. 따라서 명령은 다음과 같습니다.

find . -name net

보시다시피 그냥 일치하는 net것이므로 usbnet.ko일치하지 않습니다.

또한 인용 및 이스케이프 없이 패턴이 일치하지 않는 경우(및 nullglob비활성화 failglob된 경우) 다음과 같이 처리됩니다.있는 그대로. 예를 들어, find . -name *net*현재 디렉터리에 파일 이름이 없으면 netfind 패턴은 를 반환합니다 *net*.


따라서 문제를 해결하려면 쉘 와일드카드를 피해야 합니다. 이를 위해 인용되거나 이스케이프된 와일드카드 패턴을 사용할 수 있습니다.

find . -name '*net*' 
find . -name "*net*" 
find . -name \*net\* 

관련 정보