와일드카드와 함께 큰따옴표 사용 또는 없음 사용

와일드카드와 함께 큰따옴표 사용 또는 없음 사용

나는 우연히 만났다이것find 명령을 설명하려는 기사입니다. 다음의 예를 제공합니다.

find /tmp -iname "data*.txt"

지금 이 글여기다음과 같이 말합니다

큰따옴표는 "$"로 시작하는 단어의 대체를 억제하지 않습니다.하지만 와일드카드 문자의 확장은 억제합니다.

또한 두 명령을 시도했을 때

admin@localhost Downloads$ ls
gallifrey-road-doctors-14437-1366x768.jpg  mydir
admin@localhost Downloads$ find . -iname "*gall*"
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$ find . -iname "*gall*"  -----> A
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$ find . -iname *gall*    -----> B
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$

출력은 동일한 것 같습니다. 어떤 경우에는 다를까요? 큰따옴표가 에서 와일드카드 확장을 억제하지 않는 이유는 무엇입니까 A? 나는 A가 작동하지 않고 B만 작동할 것이라는 인상을 받았습니다.

답변1

B의 경우:

find . -iname *gall*

그만큼껍데기*gall*해당 패턴과 일치하는 모든 파일 목록으로 확장됩니다 . 현재 디렉터리에는 해당 패턴과 일치하는 파일이 하나만 있으므로 다음과 같습니다.

find . -iname gallifrey-road-doctors-14437-1366x768.jpg

...그래서 find는 정확한 이름과 일치하는 파일을 검색합니다. foo-gallifrey-road-doctors-14437-1366x768.jpg찾을 수 없습니다. glob과 일치하는 파일이 두 개 이상 있으면 잘못된 find 명령이 실행될 수 있습니다. 나는 그것이 단순히 오류와 함께 종료될 것이라고 확신합니다.

A의 경우:

find . -iname "*gall*"

따옴표로 인해 쉘습관패턴을 확장하세요. 이것은 단지 다음과 같습니다(이것은 find보이는 것입니다):

find . -iname *gall*

그런 다음 find 명령은 해당 패턴을 사용하여 해당 패턴과 일치하는 모든 파일(및 디렉터리 등)을 검색합니다. 패턴과 일치하는 모든 파일을 gallifrey-road-doctors-14437-1366x768.jpg모두 찾습니다 .foo-gallifrey-road-doctors-14437-1366x768.jpg*gall*

따라서 명령은 셸을 통과합니다(따옴표 안의 글로브를 확장하지 않고 가장 바깥쪽 따옴표 레이어를 제거함).그 다음에find내부적으로 패턴을 사용하여 파일 이름을 일치시키는 으로 이동합니다 .

관련 정보