zip 및 rm 명령에서 와일드카드 문자 *가 왜 그렇게 다른가요?

zip 및 rm 명령에서 와일드카드 문자 *가 왜 그렇게 다른가요?

나는 나를 위해 몇 가지 파일 작업을 수행하는 스크립트를 작성했습니다. *특정 유형의 모든 파일에 함수를 적용하기 위해 와일드카드 연산자를 사용하고 있는데 한 가지 이해가 안 되는 점이 있습니다. unzip이런 폴더에 모든 파일을 넣을 수 있어요

unzip "*".zip

그러나 나중에 모든 zip 파일을 삭제하려면 다음을 수행해야 합니다.

rm *.zip

즉, 따옴표가 필요하지 않습니다. 반면에 *("파일 불일치" 경고 표시)만 주면 압축 해제가 작동하지 않습니다.

왜 다른가요? 나에게 이것은 똑같은 작업인 것 같다. 아니면 와일드카드를 잘못 사용하고 있는 걸까요?

와일드카드 소개유닉스에서는 이것을 깊이 파고들지 마세요. rm나 문서에서는 zip아무 것도 찾을 수 없습니다.

저는 Mac(Yosemite)에서 터미널을 사용하고 있습니다.

답변1

상황을 아주 잘 설명해 주셨네요. 퍼즐의 마지막 부분은 unzip기본적으로 와일드카드를 처리할 수 있다는 것입니다.

http://www.info-zip.org/mans/unzip.html

논쟁

파일[.zip]

...

와일드카드 표현식은 일반적인 Unix 셸(sh, ksh, csh)에서 지원되는 표현식과 유사하며 다음을 포함할 수 있습니다.

* 0개 이상의 문자 시퀀스와 일치합니다.

* 와일드카드를 인용하면 쉘이 와일드카드를 확장하는 것을 방지하여 쉘이 unzip와일드카드를 확인하고 자체 논리에 따라 확장을 처리하도록 할 수 있습니다.

rm반면에 와일드카드는 지원되지 않습니다.그 자체로이므로 와일드카드를 인용하면 rm파일 이름에서 문자 그대로 별표를 찾도록 지시하게 됩니다.

unzip *.zip이것이 작동하지 않는 이유는 unzip구문이 여러 zip 파일을 전혀 허용하지 않기 때문입니다. 인수가 여러 개인 경우 두 번째 및 후속 인수는 아카이브의 파일이 될 것으로 예상됩니다.

압축 풀기 [-Z] [-cflptTuvz[abjnoqsCDKLMUVWX$/:^]] 파일 [.zip] [파일...] [-xx 파일...] [-d exdir]

답변2

이 두 명령의 차이점은 따옴표 *문자입니다. 쉘에서 명령을 호출하고 이 *문자를 인수로 사용하면 쉘 자체가 인수를 평가합니다. 이 예를 보세요:

$ ls
file1.zip  file2.zip  file3.zip  file4.txt

다음이 있습니다 *:

$ ls *.zip
file1.zip  file2.zip  file3.zip

쉘은 와일드카드를 평가하고 다음과 같이 명령을 작성합니다.

$ ls file1.zip  file2.zip  file3.zip

인용된 와일드카드를 사용하면 문자 그대로 다음과 같은 이름의 파일로 해석됩니다 *.zip.

$ ls "*".zip
ls: cannot access *.zip: No such file or directory

unzip여러 압축 파일을 인수로 사용하여 유틸리티를 호출할 수 없습니다. 그러나 개발자는 이를 위해 다른 접근 방식을 선택했습니다. 맨페이지에서:

파일[.zip]

[...] 와일드카드 표현식은 일반적인 Unix 셸(sh, ksh, csh)에서 지원되는 표현식과 유사합니다. [...] (운영 체제에 의해 해석되거나 수정될 수 있는 문자는 반드시 인용하십시오., 특히 Unix와 VMS에서는 더욱 그렇습니다. )

답변3

차이점은 첫 번째 경우 쉘 자체가 글로브를 확장한다는 것입니다.

% cd /                                                       
% echo *
Applications Library Network System Users Volumes bin cores ...
% 

두 번째 경우에는 애플리케이션 자체가 해당 문자를 사용하여 Something™을 수행합니다.

% cd /
% perl -E 'chdir "/tmp" or die; say for glob($ARGV[0])' "*"
com.apple.launchd.aj4FEhYqm5
...

따옴표가 없으면 쉘은 먼저 글로브를 확장하고 쉘 글로브가 확장되는 대상을 사용하여 명령이 실행됩니다.

답변4

zip이 여러 인수를 처리하는 방식으로 인해 따옴표가 필요합니다.

rm: 매개변수 목록의 모든 파일을 삭제합니다.

zip: 첫 번째 매개변수에서 파일의 압축을 푼다. 나머지 매개변수의 파일만 추출합니다.

$ ls *.zip
file1.zip  file2.zip  file3.zip
$ unzip *.zip
Archive:  file1.zip
caution: filename not matched:  file2.zip
caution: filename not matched:  file3.zip

보시다시피 file1.zip에서 file2.zip과 file3.zip을 찾으려고 시도합니다.

여러 개의 zip 파일을 한 번에 추출할 수 있도록 zip은 자체적으로 glob을 해석하고 다양한 결과를 생성하는 것을 지원합니다.

관련 정보