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