'rm. *'은 상위 디렉토리를 삭제합니까?


53

.*bash로 표현식 을 확장하여 현재 및 상위 디렉토리를 포함합니다.

$ ls -la
total 2600
drwxrwxrwx   2 terdon terdon 2162688 Sep 10 16:22 .
drwxr-xr-x 142 terdon terdon  491520 Sep 10 15:34 ..
-rw-r--r--   1 terdon terdon       0 Sep 10 16:22 foo
$ echo .*
. ..

내가 실행하면 rm -rf .*내 데비안 사용하여 GNU 강타에, version 4.2.36(1)-release그리고 rm에서 rm (GNU coreutils) 8.13,이 메시지가 나타납니다 :

$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'

이것은 GNU입니까, 아니면 POSIX입니까? 위의 명령 자동으로 삭제됩니다 어떤 유닉스 계열의 시스템이 있습니까 .및 ..?

또한 이것이 쉘 또는 rm명령 자체 의 안전 기능 입니까?


4
나는이 질문의 맥락에서 알고 rm,하지만 난 당신이 여전히 예기치 않은 결과를 가질 수 있음을 언급 할 가치라고 생각 chmod, chown일치하는 경우 등 .*.
— Aaron Copley

답변:


59

의 POSIX 사양의 최신 (2017 년 기준) 버전 rm유틸리티입니다 여기 (및 이전 이 )과의 삭제를 금지 .하고 ...

파일 dot 또는 dot-dot 중 하나가 피연산자의 기본 이름 부분 (즉, 최종 경로 이름 구성 요소)으로 지정되거나 피연산자가 루트 디렉토리로 해석되는 경우 rm은 진단 오류를 표준 오류에 기록하고 아무 것도 수행하지 않습니다. 그러한 피연산자로 더.

@jlliagre가 지적했듯이 /SUSv4의 추가 부분 이 있습니다.

내가 찾을 수있는 가장 오래된 공개 유닉스 사양 ( XPF4 CAE의 REV2 (1994)), 이미 지정 .과 ..는 GNU fileutils에 속하는 명령어 변경 로그에 주석이 이미 오래된 POSIX 사양에서의 경우와 제안하지만, 제거 할 수 없습니다.

그것은에 적용됩니다 dir/..및 ../뿐만 아니라,하지만 (솔라리스 11과 맥 OS와 같은 UNIX 인증을 포함한) 일부 구현은 여전히에 대해 보호하지 않습니다 rm -rf ../또는 rm -rf .*/).

역사

초기 유니스

-r옵션에 rm그것은 단지 디렉토리의 내용을 삭제 되었더라도 유닉스 V3 (1973)에서 추가되었다, 당신은 여전히 사용해야 할 것 rmdir디렉토리를 제거 할 수 있습니다.

이는 Unix V7 (1979, Bourne 쉘을 도입했으며 대부분의 Unices에서 파생 된 릴리스)에서 변경되었습니다. rm -r이제 디렉토리도 제거되었으며 ..디렉토리 트리는 삭제되지 않습니다 . 맨 페이지 상태 :

..실수로 같은 일을하는 반사회적 결과를 피하기 위해 파일을 제거하는 것은 금지되어 rm -r .*있습니다.

( 포함되어 있기 때문에 모든 것을 삭제하므로 rm -r .*여전히 반 사회적 이라고 주장 할 수 .있습니다).

또는 항목을 링크 .해제하지 않더라도 여전히 제거를 수락했습니다 . 따라서 현재 디렉토리를 비우는 효과적인 방법이었습니다....rm -r .

또한 보호는 리터럴에 대한 것을주의 ..하지 않는, 인수 dir/..또는 ./... 따라서 rm -rf ./.*여전히 상위 디렉토리의 모든 항목을 재귀 적으로 제거합니다.

그것은 그 globs와가 포함 할 수있는 버그 / misfeature 해결하기 위해 이미 있는지 흥미 .와 ..자신의 확장에있다. 즉,이 포 시스 쉘 80 년대 후반 (원래 미닉스 쉘 및 pdksh 같은에 대한 기준), 수정되었습니다 zsh(1990)와 fish(2005)가 아닌 다른 껍질이 아니라 POSIX의 특히 sh의 확장을 필요로 언어를 .*포함 .하고 ..있는 경우 그들은에 의해 반환됩니다 readdir()( bash에서만 부분적으로 문제를 해결 shopt -s dotglob제외하고 globs와 (여기서 .xxx사람)가 포함되어 있지 않습니다 .또는 ..,와 함께 ksh, 당신은 수행하여 문제를 해결할 수 있습니다 FIGNORE='@(.|..)').

정확히 금지 .된 내용도 추가 되었을 때 항상 명확한 것은 아니며 각 유닉스에 따라 다릅니다. 아래 몇 가지 결과.

BSD

금지는 .2.9BSD (1983)와 2.10BSD (1987) 사이, 4.2BSD (1983)와 4.3BSD (1986) 사이에 추가되었다 ( unix-history-repo에서 1985 년 타임 스탬프가 변경됨 참조 ).

$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.9BSD/root.tar.gz |
    zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `..'
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.10bsd.tar.gz |
    zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'\n");

들어 dir/.와 dir/.., 참조 1988 년이 변경 (BSD 4.3 인터넷 / 1).

이 현재까지 rm의 FreeBSD의 (그리고 맥 OS와 같은 파생 상품은) 여전히시 현재 또는 부모 디렉토리를 비워 rm -rf ./또는 rm -rf ../(문제에 대한 불구하고 rm -rf .*/).

시스템 V

V7 이후 AT & T Unix 파생 상품에 대해 소스 나 바이너리를 공개적으로 사용할 수 없기 때문에 많은 정보가 없습니다. 온라인 매뉴얼에서 HPUX (System III 기반)는 여전히 ..적어도 금지하고 있지만 실제로는 적어도 SysIII가 삭제를 금지하지 않았 음을 나타냅니다 .( 편집 : SysIII rm소스 코드 를 보면, Unix V7 이후 거의 변경되지 않았습니다.

POSIX를 준수 해야하는 삭제를 언급 .했거나 ..금지 된 다른 모든 온라인 매뉴얼 .

솔라리스는 rm여전히시 현재 또는 부모 디렉토리를 비워 rm -rf ./나 rm -rf ../.

암소 비슷한 일종의 영양

GNU fileutils 의 초기 변경 로그 에는 모든 기록 정보가 있습니다.

원래는 삭제 .되거나 ..금지 되지 않았지만 1990 년에서 1991 년 사이에 ..먼저 금지 된 다음 모두 금지 (포함 dir/.) 가 금지되었습니다 .

다른

우리가 보았 듯이,에서 zsh의 확장 .*(또는 글로브는) 결코 포함되지 않습니다 .또는 ..(심지어에서 sh에뮬레이션 모드). rm(당신이 경우 얻을 내장은 zmodload zsh/files) 때문에 취급하지 않습니다 .또는 ..특별. 그래서, 그와 zsh내장, 당신은 할 수 있습니다 rm -rf .또는 rm -rf ..비 웁니다 .또는 ..하지만 rm -rf .*제거하지 않습니다 .나 ...

busybox rm에서 삭제 금지 .및 ..0.52 (2001)에 추가됨


홀수, 그것은 rm -rf . /(공백에주의) 두 개의 경고 (for .및 /) 를 인쇄 하고 종료 해야한다고 지정하는 것처럼 보이지만 몇 개월마다 그로부터 복구하는 방법을 묻는 질문이있는 것 같습니다.
— Kevin

6
@Kevin 모든 시스템이 POSIX를 준수하는 것은 아니며 루트 디렉토리 제한이 최신 POSIX 릴리스에서만 명시 적으로 추가되었습니다.
— jlliagre

@jlliagre 알겠습니다. GNU는 일반적으로 POSIX (물론 + 확장자)를 구현하려고 시도하는데, 이것들을 넣기를 원하지만 상당히 새롭다면 그것을 설명 할 것입니다.
— 케빈

2
@Stephane : 당신 말이 맞지만, 나는 여전히 대답의 시작 부분에 큰 "예, 일어날 수 있습니다! 그러나 ..."를 추가하여 사람들이 의심 할 여지없이 일부 사람들에게 -POSIX 호환) 시스템에서 상위 디렉토리를 삭제할 수 있습니다. 나는 항상 그 가능성을 지적하려고 노력한다 (즉, 때로는 답을 읽기 / 기억하기 어렵더라도 안전한 편을 유지하려고 노력한다) ^^
— Olivier Dulac

1
@ MartinSchröder, BSD에서는 2.8BSD와 2.10BSD 사이에 추가되었으며 ( ".."만 UnixV7에서와 같이 금지되었습니다) 3BSD와 4.3RENO 사이에 추가되었습니다. SysV 시스템에서는 덜 명확합니다. 예를 들어 HPUX 매뉴얼에서는 ".."만 금지한다고 주장하지만 사실상 "."는 모두 금지합니다. ".."는 최신 설명서가 아닙니다.
— Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.