'.'을 제거 할 수없는 이유는 무엇입니까? 예배 규칙서?


40

'.'를 제거하려고했습니다. 예배 규칙서. 부모 디렉토리로 가지 않고도 작업 디렉토리를 삭제할 수 있다고 생각했습니다.

내 질문의 요점은 리눅스 시스템이 파일을 삭제하는 방법에 대한 통찰력을 찾는 것입니다.


1
실제로 부모 디렉토리로 이동하지 않고 현재 디렉토리를 제거하려면 rm -r 'pwd'를 시도하십시오
faadi

7
이 질문은 그 질문을 복제하지 않습니다. 그 이유는 왜 하드 링크가 합성되지 않고 물리적 실체로 존재하는지 묻습니다. 이 질문뿐만 아니라 이유를 물어 rm .rmdir .하지 작업을하지만, 왜이되어 지정된 하드 링크의 물리적 존재의 독립적 인 작동하지로.
JdeBP

9
가지를 자르기 위해 나무 위로 올라간 이미지. 자르기 시작할 때 컷의 어느쪽에 앉아 있습니까? (간단히 말해서 리눅스 파일 시스템입니다.)
michael

7
rm -rf .*이것을 포함하여 .뿐만 아니라 .., 그리고 그 다음을 포함하여 이것을 찾는 다고 상상해보십시오 ../...
gerrit

답변:


89

현재 디렉토리를 제거해도 파일 시스템 무결성 또는 해당 논리 조직에는 영향을 미치지 않습니다. 매뉴얼 페이지 .에있는 POSIX 표준에 따라 제거를 방지 rmdir(2)합니다.

path 인수가 최종 구성 요소가 dot 또는 dot-dot 인 경로를 참조하면 rmdir ()이 실패합니다.

rm매뉴얼 페이지 에서 한 가지 근거를 찾을 수 있습니다 .

rm 유틸리티는 실수로 다음과 같은 작업을 수행 한 결과를 피하기 위해 이름 점과 점을 제거하는 것이 금지됩니다.

rm -r. *

다른 한편으로, 현재 디렉토리를 명시 적으로 제거하는 것 (즉, 전체 또는 상대 경로를 명시하여)은 적어도 SVR3 이후 SVR2부터 SVR2까지 금지 된 SVR3 이후로 유닉스에서 허용되는 작업입니다. 이것은 활발하게 읽거나 쓰는 파일을 제거 할 때 발생하는 것과 매우 유사합니다. 삭제 파일에 액세스하는 프로세스는 아무 일도없는 것처럼 읽기 및 쓰기 작업을 계속합니다. 프로세스 현재 디렉토리를 제거한 후,이 디렉토리는 경로를 통해 더 이상 액세스 할 수 없지만 프로세스가 종료되거나 자체 디렉토리를 변경할 때까지 파일 시스템에 존재합니다.

현재 디렉토리에 cd ..더 이상 ..항목 이 없기 때문에 프로세스는 현재 디렉토리에 상대적인 경로를 사용하여 cwd (예 :)를 변경할 수 없습니다 .

누군가 유형이 때 rmdir ., 그들은 가능성이 현재 디렉토리 항목이 제거 될 것으로 예상하지만, 디렉토리가 제거 될 때 (그 경로를 사용하여), 세 개의 디렉토리 항목이 실제로 제거 ., ..및 디렉토리 자체를.

.이 디렉토리의 디렉토리 항목 만 제거하면 비준수 디렉토리가 생성되지만 이미 언급 한 바와 같이 표준에서는 금지되어 있습니다.

@ Emmanuel이 올바르게 지적했듯이 제거 .가 허용되지 않는 두 번째 이유 가 있습니다. 강력한 제한으로 기존 디렉토리에 대한 하드 링크 생성을 지원하는 POSIX 호환 OS (HFS +가 포함 된 Mac OS X)가 하나 이상 있습니다. 이 경우 디렉토리 내부에서 어떤 하드 링크가 제거 될 것인지 알 수있는 명확한 방법이 없습니다.


9
pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html "제거 할 상위 디렉토리의 파일 (디렉토리) 이름이 명확하지 않기 때문에 경로 이름 / dot 삭제의 의미는 명확하지 않습니다. 에 대한 여러 링크의 링크 "
Emmanuel

@Emmanuel 링크가 두 개 이상인 디렉토리 (즉, 비어 있지 않은)를 제거하는 것은 디자인에 의해 이미 금지되어 있습니다 (빈 디렉토리 아님). 링크 카운트가 1 인 디렉토리는 표준에 의해 금지됩니다 (적어도 링크 카운트가 의미가있는 파일 시스템에서는).
jlliagre 2016 년

3
@ jlliagre : 여러 링크가 포함 된 디렉토리 아니라 여러 링크 가있는 디렉토리에 대한 질문입니다 . 일부 파일 시스템 및 / 또는 운영 체제에서는이를 허용하지 않지만 전부는 아닙니다.
Jörg W Mittag 2016 년

@ JörgWMittag 여러 디렉토리 포함하는 디렉토리 모든 서브 디렉토리가 해당 디렉토리에 ..링크되어 있기 때문에 의도적으로 여러 개의 링크를 습니다. link count > 2압도적 인 대다수의 OS 및 파일 시스템 에 대한 고유 한 경우 이므로 "일부 파일 시스템 및 / 또는 운영 체제"는 과소 평가됩니다. 역사적으로 알려지지 않은 유일한 예외는 HFS +가 포함 된 Mac OS X로, 누구와 무엇을 할 수 있는지에 대한 제한을 추가합니다. POSIX 주석이이 이상한 점에 관한 것입니다. 참조 unix.stackexchange.com/questions/22394/...
jlliagre

이봐, 내가 전에 해본 rm -r .*결과 부모 디렉토리 아래의 모든 것을 재귀 적으로 날려 버렸습니다 ... 10 ~ 2 년 전 이었지만 rm더 이상 이것을 허용하지 않는 것이 좋습니다 .
antak

9

현재 디렉토리 안에 .있고 자체 참조 일 뿐이 므로 무결성을 위해 이와 같이 수행됩니다 .

부모로 가거나 rmdir경로를 사용하여 전화 해야합니다.

rmdir `pwd`

자주 필요한 경우 다음과 같이 별칭을 설정할 수 있습니다.

alias rmc='rmdir `pwd`'

.. rmc현재 디렉토리를 제거하기 위해 단독 으로 호출 될 수 있습니다 .


13
그런데 왜 / 어떻게 않는 가상의 rmdir .방식으로 명령 타협 파일 시스템 무결성 rmdir $(pwd)또는 rmdir "$PWD"하지 않는 이유는 무엇입니까?
G-Man, 'Reinstate

4
FS 무결성의 문제가 아니라 논리적 조직의 문제입니다. 현재 디렉토리를 선택했을 때, 쉘에게 다가오는 작업에이 디렉토리를 사용하도록 지시하지만 그 자체로는 무언가를 제거 할 수 없습니다.
Julie Pelletier

7
추측처럼 보일 까봐 두렵습니다.
Emmanuel

4
@FranklinPiat 나는 당신의 의견이 특히 유용하다고 생각하지 않았다 : 1. OP는 어디에 사용 rm *했고, 쉘 히스토리는 무엇을 의미 하는가? 2. 답은 그 이유 를 설명했다. 3. 세심한 관리?
JBentley

4
당신이 경우에 G-남자 @ rmdir $(pwd), pwd예를 들어 현재 디렉토리에 대한 논리적 이름을 파악, /foo/bar/baz다음 rmdir, 그 경로를보고의 제거 baz로부터 입력 /foo/bar조건이 충족 제공하는 디렉토리. 이것은 말이됩니다. 반면에이 명령 은 현재 디렉토리에서 항목 rmdir .을 제거하라는 지시입니다.이 명령 .은 허용되지 않으며 (모든 디렉토리 .에 자신을 가리키는 항목 이 있다는 제약 조건을 위반하지 않습니다 ) 또는 유용하지 않습니다 (링크를 제거하지 않습니다) 당신이 원한다고 ) 제거.
hobbs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.