rm -rf .*
rm
삭제를 거부하는 경우에만 .
끔찍하게 종료 됩니다 ..
.
글로벌 스키마에서 이러한 특수 디렉토리를 어떻게 제외할 수 있습니까?
dotglob
모든 파일이 아닌 점으로 시작하는 파일만 일치시키고 싶었기 때문에 이 방법은 작동하지 않았습니다 .
답변1
Bash의 경우 특수 변수를 null이 아닌 값으로 설정하면 전역 변수를 확장할 때 GLOBIGNORE
해당 변수가 무시됩니다 . ~에서.
..
배쉬 문서:
쉘
GLOBIGNORE
변수를 사용하여 패턴과 일치하는 파일 이름 세트를 제한할 수 있습니다.GLOBIGNORE
설정된 경우GLOBIGNORE
이러한 패턴 중 하나와 일치하는 각 일치하는 파일 이름이 일치 목록에서 제거됩니다. 이 옵션을 설정 하면 대소문자에 관계없이nocaseglob
in의 패턴과 일치하는 항목을 검색합니다 .GLOBIGNORE
설정되고 비어 있지 않으면 filename.
및..
은 항상 무시됩니다.GLOBIGNORE
그러나GLOBIGNORE
null이 아닌 값으로 설정하면 dotglob 쉘 옵션을 활성화하는 효과가 있으므로‘.
'로 시작하는 다른 모든 파일 이름이 일치합니다.
로 설정하면 .:..
및 .
모두 ..
무시됩니다. null이 아닌 것으로 설정하면 이 동작도 발생하므로 다음과 같이 설정하는 것이 좋습니다..
그래서:
GLOBIGNORE=.
rm -rf .*
답변2
이렇게 하면 트릭을 수행할 수 있습니다.
rm -rf .[^.] .??*
이 명령은 모든 상황을 포착합니다.
.[^.]
두 문자 항목이 모두 캡처됩니다.
.??*
3자를 초과하는 파일 이름만 일치시킵니다.
답변3
@Goro가 가장 간단하고 완전히 정확한 답을 가지고 있다고 생각합니다. 그러나 나는 타이핑이 고통스럽다고 생각합니다. 나는로 바꾸는 것을 제안한다
ls .??*
와 같은 파일이 손실되는 것은 사실이지만 .a
이러한 파일은 매우 드물기 때문에 실제로는 특히 대화식 사용의 경우 중요하지 않다고 생각합니다.
답변4
그리고 extglob
:
$ shopt -s extglob
$ touch ... .a .bbb ..c foo
$ echo .!(.|)
... .a .bbb ..c
!(.|)
점 또는 null을 제외한 모든 것과 일치하므로 및를 .!(.|)
제외하고 점으로 시작하는 모든 것과 일치합니다 ..
..