와일드카드와 함께 큰따옴표를 사용하거나 따옴표 없이 사용하세요.

와일드카드와 함께 큰따옴표를 사용하거나 따옴표 없이 사용하세요.

내가 우연히 만났어이것이 기사에서는 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내부적으로 패턴을 사용하여 파일 이름을 일치시킵니다.

관련 정보