Bash에서 도트 파일만 일치시키는 방법은 무엇입니까? [복사]

Bash에서 도트 파일만 일치시키는 방법은 무엇입니까? [복사]

rm -rf .*rm삭제를 거부하는 경우에만 .끔찍하게 종료 됩니다 ...

글로벌 스키마에서 이러한 특수 디렉토리를 어떻게 제외할 수 있습니까?

dotglob모든 파일이 아닌 점으로 시작하는 파일만 일치시키고 싶었기 때문에 이 방법은 작동하지 않았습니다 .

답변1

Bash의 경우 특수 변수를 null이 아닌 값으로 설정하면 전역 변수를 확장할 때 GLOBIGNORE해당 변수가 무시됩니다 . ~에서...배쉬 문서:

GLOBIGNORE변수를 사용하여 패턴과 일치하는 파일 이름 세트를 제한할 수 있습니다. GLOBIGNORE설정된 경우 GLOBIGNORE이러한 패턴 중 하나와 일치하는 각 일치하는 파일 이름이 일치 목록에서 제거됩니다. 이 옵션을 설정 하면 대소문자에 관계없이 nocaseglobin의 패턴과 일치하는 항목을 검색합니다 . GLOBIGNORE설정되고 비어 있지 않으면 filename ...은 항상 무시됩니다. GLOBIGNORE그러나 GLOBIGNOREnull이 아닌 값으로 설정하면 dotglob 쉘 옵션을 활성화하는 효과가 있으므로 ‘.'로 시작하는 다른 모든 파일 이름이 일치합니다.

로 설정하면 .:...모두 ..무시됩니다. null이 아닌 것으로 설정하면 이 동작도 발생하므로 다음과 같이 설정하는 것이 좋습니다..

그래서:

GLOBIGNORE=.
rm -rf .*

(에서Ask Ubuntu에 대한 나의 이전 답변.)

답변2

이렇게 하면 트릭을 수행할 수 있습니다.

rm -rf .[^.] .??*  

이 명령은 모든 상황을 포착합니다.

.[^.]두 문자 항목이 모두 캡처됩니다. .??*3자를 초과하는 파일 이름만 일치시킵니다.

답변3

@Goro가 가장 간단하고 완전히 정확한 답을 가지고 있다고 생각합니다. 그러나 나는 타이핑이 고통스럽다고 생각합니다. 나는로 바꾸는 것을 제안한다

ls .??*

와 같은 파일이 손실되는 것은 사실이지만 .a이러한 파일은 매우 드물기 때문에 실제로는 특히 대화식 사용의 경우 중요하지 않다고 생각합니다.

답변4

그리고 extglob:

$ shopt -s extglob
$ touch ... .a .bbb ..c foo
$ echo .!(.|)
... .a .bbb ..c

!(.|)점 또는 null을 제외한 모든 것과 일치하므로 및를 .!(.|)제외하고 점으로 시작하는 모든 것과 일치합니다 ....

관련 정보