rm/ls와 [0-9]의 조합

rm/ls와 [0-9]의 조합

저는 쉘 명령을 배우고 있는데 [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이상으로 확장되지 않습니다.*.txtdfiojedfoi.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.

관련 정보