'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.