저는 쉘 명령을 배우고 있는데 [0-9], [[:digit:]] 등과 같은 짧은 태그를 발견했습니다. 개념 증명으로 rm 명령을 사용하여 모든 파일을 삭제해 보았습니다(좋은 습관은 아니지만 작동 방식을 이해하고 싶었습니다).
rm [0-9].txt
디렉터리에 0.txt와 9.txt라는 두 개의 파일이 있으며, 0.txt와 9.txt 파일을 삭제합니다. [0-9] 표현식이 확장된 다음 0.txt 1.txt 2 .txt를 읽는 것으로 추측됩니다.... 하지만 방금 rm 5.txt를 시도했는데 파일이 존재하지 않으면 오류가 발생합니다. 던져진다.
누군가 rm이나 ls와 함께 사용할 때 속기 명령이 어떻게 작동하는지 알려주세요.
답변1
이것은 ... 불리운다와일드카드(bash 문서에 대한 링크이지만 이는 bash에만 국한되지 않습니다.)
를 실행하면 rm [0-9].txt
셸은 [0-9].txt
패턴과 일치하는 디렉터리의 파일 목록으로 확장됩니다. 그런 다음 이 목록은 인수로 전달됩니다 rm
(각 파일은 별도의 인수로).
아니요, 쉘은 그것을 확장하지 않고 0.txt 1.txt ... 9.txt
일치하는 파일을 찾습니다.
왜 확장할 glob 패턴 없이 를 실행하여 rm 5.txt
인수가 있는 그대로 전달되고 rm
파일이 존재하지 않는 것을 확인하고 불평하는 이유는 무엇입니까?
다른 것을 시도해 보세요. 동일한 명령 rm [0-9].txt
이지만 디렉터리에 있습니다.아니요이 패턴과 일치하는 파일이 없습니다. 불만사항이 다시 표시되지만 rm
이번에는 다음과 같이 표시됩니다.
rm: cannot remove '[0-9].txt': No such file or directory
이것은 glob 패턴이 어떤 것과도 일치하지 않으면(기본적으로) 발생하는 일입니다. 쉘은 이를 확장하지 않고 변경되지 않은 채로 둡니다.
이 유형의 패턴 일치에 대한 POSIX 참조:패턴 일치 표기법.
답변2
테스트를 사용하지 말고 rm
테스트를 사용하십시오 echo
!
[0-9].txt
와일드카드 패턴입니다(glob이라고도 함). 기존 파일 이름 목록으로 확장됩니다. glob 패턴에서는 세 개의 와일드카드 문자를 사용할 수 있습니다.
- 이 문자는
*
모든 문자 시퀀스(빈 시퀀스 포함)와 일치합니다. - 이 문자는
?
모든 문자와 일치합니다. - 대괄호 표현식은
[…]
대괄호 안에 나타나는 모든 문자와 일치합니다.
[0-9]
응 바로가기[0123456789]
. 대괄호 안의 두 문자 사이에 a를 사용하여-
해당 두 문자와 그 사이에 있는 두 문자를 나타낼 수 있습니다. 예를 들어[0-9a-z_]
숫자, 소문자 또는 밑줄을 일치시킵니다.
여기서는 언급하지 않겠지만 괄호에 관한 몇 가지 규칙도 있습니다.
다시 말하면 이러한 모든 구성은 기존 파일과만 일치합니다. 해당 이름의 파일이 없으면 [0-9].txt
확장되지 않으며, 해당 이름의 파일이 없으면 그 5.txt
이상으로 확장되지 않습니다.*.txt
dfiojedfoi.txt
예:
$ ls
0.txt 10.txt 1a.txt 9.txt hello.txt world.txt
$ echo [0-9].txt
0.txt 9.txt
$ echo [0-9][0-9].txt
10.txt
$ echo [0-9][0-9][0-9].txt
[0-9][0-9][0-9].txt
$ echo [0-9]?.txt
1a.txt 10.txt
$ echo [10-19].txt
0.txt 9.txt
$ echo *.txt
0.txt 1a.txt 9.txt 10.txt hello.txt world.txt
$ echo *l*
hello.txt world.txt
echo [0-9][0-9][0-9].txt
일치하는 파일이 없기 때문에 패턴이 반복됩니다. 왜 [10-19].txt
이 두 파일만 일치하고 10.txt
또는 는 일치 하지 않는지 이해해야 합니다 19.txt
.