이것은 다음 폴더가 포함된 현재 디렉터리입니다.
rpea-vd1-430: ls
rev10 rev11 rev12 rev2 rev3 rev4 rev5 rev6 rev7 rev8 rev9 Synthesis.config Synthesis.html
다음 Linux 명령을 사용하여 폴더를 삭제했습니다.
rm -rf rev[1-11]
하지만 내가 주면 내 명령은 실패합니다
rm -rf rev[1-9]
rev1에서 rev9까지 명명된 디렉토리를 제거하기 때문에 두 자리 숫자를 고려하지 않으시겠습니까?
예상 출력:
rev11 Synthesis.config Synthesis.html
답변1
중괄호 확장은 숫자가 아닙니다.
rev[1-9]
[1-9]
모두와 함께 확장됩니다특징1에서 9 사이rev[2468]
으로 확장될 예정입니다.rev2 rev4 rev6 rev8
rev[A-Z]
다음으로 확장됩니다revA revB ... revZ
(파일이 존재한다고 가정).rev[1-11]
또한 1에서 1 사이의 모든 문자로 확장됩니다.rev[1-15]
문자 5뿐만 아니라 1과 1 사이의 모든 문자로 확장되므로rev[15]
, 일치rev1
및rev5
답변2
왜
rm -rf rev[1-9]
두 자리 숫자를 고려하지 않습니까?
왜 이렇게 되어야 할까요? 숫자를 하나만 지정했습니다. 대괄호 표현식은 [..]
정확히 하나의 문자와 일치하며, 이는 대괄호 안에 나열된 문자 중 하나여야 합니다. 따라서 일부 숫자가 있는 rev[1-9]
형식의 파일 이름을 일치시키십시오 ( 제외 ). 다시 말하지만, 여러 번 지정되더라도 대괄호 안에 지정된 유일한 문자이므로 정확히 일치합니다 . 또는 와 동일합니다 . 다시 말하지만 와 동일합니다 .revN
N
0
rev[1-11]
rev1
1
rev[1]
rev1
rev[1-12]
rev[12]
rev[0-9]*
을 사용하여 시작하는 모든 rev
파일 이름, 숫자, 그 다음 무엇이든 일치시키거나 다음을 사용할 수 있습니다.확장된 글로벌Bash 및 ksh에서 rev+([0-9])
.subexpression은 정규 표현식과 유사하게 +(...)
괄호로 묶인 패턴과 한 번 이상 일치합니다 .(...)+
{a..b}
반면 중괄호 확장은 파일 이름을 일치시키는 대신 문자열을 생성하므로 rev{1..12}
generate rev1
, rev2
, ... 를 사용할 수 있습니다 rev12
. 이는 파일이 존재하는지 여부를 고려하지 않으므로 파일도 생성되지만 rev1
귀하의 예에서는 그렇지 않습니다.
편집에서 ?를 제외하고 rm
일치하는 모든 파일을 일치시키고 싶습니까 ? 가장 쉬운 방법은 아마도 예외의 이름을 일시적으로 바꾸는 것입니다( 존재하지 않는다고 가정).rev*
rev11
arev11
$ mv rev11 arev11
$ rm -r rev*
$ mv arev11 rev11
버팀대 확장을 사용할 수 있습니다.
$ rm -r rev{{1..10},12}
(상한값을 너무 높게 설정하면 존재하지 않는 이름이라는 오류가 발생합니다.)
11이 아닌 숫자와 일치하는 glob을 만드는 것은 다음과 같이 다소 까다롭지만 먼저 다시 확인하는 것이 가장 좋습니다.
$ echo rm -r rev[0-9] rev1[02-9] rev[2-9][0-9]
답변3
중괄호를 사용해야하며 다음을 수행해야합니다 ..
.
rm -rf rev{1..11}
echo rev[1-11]
의 차이점을 확인하세요 echo rev{1..11}
.