Linux : "."및 ".."없이 디렉토리를 어떻게 만들 수 있습니까?


6

다음 문제가 busybox에만 해당되는지 확실하지 않습니다. busybox가 설치된 내장형 장치가 있습니다. 내가 이해 한 바에 따르면, 디렉토리가 만들어지면 보통 2 개의 숨겨진 파일이 자동으로 만들어집니다 : .현재 디렉토리 ..를 나타내고 부모 디렉토리를 나타냅니다. 예를 들어을 입력 mkdir -p /tmp/normal_dir; cd /tmp/normal_dir; ls -a하면 출력은입니다 . ...

그러나 기존 디렉토리 ( /tmp/strange_dir)가 .및을 표시하지 않는 경우를 보았습니다 ... 즉, cd /tmp/strange_dir; ls -a상위 디렉토리로 이동해도 여전히 작동하지만 을 입력 하면 출력이 비어 있습니다. 즉,를 입력 cd ..하면 내용이 정확합니다.

내 질문은 : 이러한 디렉토리가없이 어떻게 수 ...(같은 /tmp/strange_dir)를 만들 수? 나는 의아해합니다.


흥미로운 질문입니다. Unix.SE에 문의하는 것이 좋습니다. 내 본능은 stat디렉토리에 있습니다. 않습니다 cd strange_dir; stat -l .아무것도주지?
Sean Allred 4:18에

다른 디렉토리 show ...?를 수행하십시오. 수정 된 것은 ls명령입니다 (예 : ls내부적으로 일반을 호출 ls하지만 출력 ...결과 에서 제거 되는 별명 작성) .
Javier Mr

'/ tmp / strange_dir'만이 문제가 있습니다. 'stat -L / tmp / strange_dir'을 입력하면 시도한 다른 디렉토리와 비슷한 출력이 나타납니다. 관찰 된 한 가지 주요 차이점은 크기가 0이고 다른 디렉토리의 크기가 0보다 크다는 것입니다. 예를 들어, 'mkdir -p'를 사용하여 새 디렉토리를 작성하면 크기가 40이됩니다. 아마도 크기 0은 직접적인 원인이 아닙니다. '.'표시 그리고 '..'. 따라서 다음 질문은 다음과 같습니다. Size가 0 인 디렉토리를 만드는 방법은 무엇입니까?
jonathanzh

실제로 디렉토리가 아닌 다른 디렉토리 ( "모든 것이 파일" ) 인지 확실 합니까?
획기적인

@Breakthrough : OP에 따르면 cd /tmp/strange_dir작동합니다. 그것은 그것이 디렉토리임을 증명하는 것 같습니다.
Scott

답변:


3

심볼릭 링크를 통해 디렉토리에 액세스하고 있지만 링크 된 디렉토리가 제거 된 경우에 발생할 수 있습니다. 예를 들어,에서 /tmp디렉토리와 해당 디렉토리에 대한 심볼릭 링크를 만들어 보겠습니다.

$ cd /tmp
$ mkdir normal_dir
$ ln -s normal_dir strange_dir

이제로 이동 strange_dir하면 예상 출력을 얻습니다.

$ cd strange_dir
$ ls -a
. ..

그러나 디렉토리 normal_dir 변경 하지 않고 디렉토리 제거하면 실제로 흥미로운 결과를 얻습니다.

$ rmdir /tmp/normal_dir
$ ls -a

$ ls -al
total 0

따라서 우리의 링크는 아무것도 가리 키지 않지만 쉘의 작동하는 "디렉토리"는 여전히 동일합니다.

$ pwd
/tmp/strange_dir

$ cd /tmp/strange_dir
bash: cd: /tmp/strange_dir: No such file or directory

$ ls -al
total 0

stat -L .작업 디렉토리가 여전히있는 동안 실행 하면 위의 주석에서 설명한 것처럼 /tmp/strange_dir표시 Size: 0됩니다. 출력 결과에 ls아무 것도 표시되지 않지만 (이 경우 .에도 ..) 아무 것도 표시하지 않지만 이 경우 상위 디렉토리 로 계속 탐색 할 있습니다 ...

$ cd ..
$ pwd
/tmp

$ ls -a
. .. strange_dir

심볼릭 링크는 여전히 존재하지만 아무 것도 가리 키지 않으므로 디렉토리 를 다시 만들지 않으면 이 시점 cd으로 돌아갈 수 없습니다 . 정리하려면을 호출하여 심볼릭 링크를 제거하면됩니다 .strange_dir/tmp/normal_dirrm /tmp/strange_dir


strange_dir크기 0을 가질 수 있고 상위 디렉토리로 올라갈 수 있는 경우에 대한 훌륭한 설명 . 그러나 내 경우는 달라 보입니다 strange_dir. 심볼릭 링크가 아니며 항상 다시 돌아갈 수 있습니다.
jonathanzh

이것은 실제로 심볼릭 링크와 관련이 없습니다. 그것은 현재 디렉토리를 제거하는 것입니다 (당신이있는 동안). 내 대답은 이미 (1) 시나리오에 심볼릭 링크가 포함되어 있지 않고 (2) 현재 디렉토리에 대한 정보를 얻는 대신 사용했다는 사소한 차이점으로 이미 해당 시나리오를 정확하게 설명했습니다 . … 마지막으로, OP가 여전히 존재하고 여전히 작동 한다는 사실 이이 설명을 배제합니다. ls -ldistat -L ./tmp/strange_dircd /tmp/strange_dir
스콧

@ Scott FWIW, 나는 당신의 대답에 동의합니다 (당신이 가진 공감대는 나에게서 온 것입니다) ... 나는 이것이 일어날 수있는 경우를 확장하려고했습니다.
획기적인

1

누군가가 말하면 그러한 수차가 생길 수 있다고 생각할 수 있습니다.

mkdir /tmp/strange_dir

파일 시스템이 가득 찼을 때 (즉, 사용 가능한 블록이 없음). 에 이미 strange_dir 디렉토리 항목 을 생성하는 것이 가능했을 것 입니다 /tmp. 왜냐하면 이미 할당 된 블록 중 하나에 사용되지 않는 공간이 몇 바이트에 불과하기 때문입니다 /tmp. 그러나 블록 strange_dir자체 를 할당하는 것은 불가능 했기 때문에 ...항목 을 작성하는 것은 불가능했을 것 입니다. 이 경우 mkdir프로그램이에서 strange_dir디렉토리 항목 을 제거 (링크 해제) 할 것으로 예상 /tmp하지만 소프트웨어가 항상 내가 원하는 것을 수행하지는 않습니다.

다른 가능성 :

  • mkdirstrange_dir디렉토리 항목 /tmp 작성과에 ...항목 작성 사이에 중단 (종료) 되었습니다 strange_dir. 나는 기대 mkdir인터럽트 신호 (즉, 잡으려고 Ctrl+를 C) 자체 뒤처리하지만, 소프트웨어 및 그것의 나의 기대에 대한 위의 내용 참조. 물론 킬 신호 나 시스템 충돌을 포착 할 수 없습니다. 
  • rmdir...항목을 strange_dir 연결 해제하고의 strange_dir디렉토리 항목을 연결 해제하는 중에 중단 (종료) 되었습니다 /tmp.

fsck충돌 후 실행되는 것이를 감지하고 strange_dir그것에 대해 무언가를 할 것으로 기대할 수 있지만 ....

예, 디렉토리가 공의 크기가있는 경우 물론, 그게에 할당에는 블록이 없다는 것을 의미하며, 따라서 어떤 내용 (같은 심지어 어린 아이들을 가질 수 없습니다 ...).

없는 cd ..경우 왜 작동 하는지 이해 하지 ..못하지만 명령 행 인터페이스를 사용하여 내부에서 디렉토리 제거에 대한 토론을 참조하십시오 . 그것은 밝혀졌다

mkdir / tmp / strange_dir
cd / tmp / strange_dir
ls -lai ← 정상으로 표시 됩니다.  .. inode 번호가 있습니다.
rmdir / tmp / strange_dir
pwd ← 여전히 / tmp / strange_dir을 보고합니다.
ls -lai ← 빈 디렉토리를 보여줍니다 : 총 0
ls -ldi ← Shows . 이전과 같은 inode 번호로
                          그러나 크기는 0이고 링크 수는 0입니다. 
cd .. ← / tmp에 다시 넣습니다.

이 상황은이 질문의 상황과 완전히 유사하지는 않습니다. 왜냐하면이 경우에는에서 strange_dir제거 되기 때문 입니다 /tmp. 그러나 그것은 cd ..특별 하다는 것을 암시 하며 때로는 할 수있는 명확한 메커니즘이 없을 때 작동합니다.

pwd와 / bin / pwd의 이상한 차이는 이것이 어떻게 작동하는지에 대한 가능성을 시사합니다. 쉘은 현재 디렉토리를 추적합니다. 즉, 현재 디렉토리가 무엇인지에 대한 최상의 추측을 추적합니다. 그것은 상징적 인 링크와 같은 속임수에 속아서

mkdir /tmp/foo
cd /tmp/foo
mv /tmp/foo /tmp/foobar

즉, 그것은 여전히 현재 디렉토리이라고 생각합니다 /tmp/foo, 그래서 그 무엇을 pwd보고 있지만 pwd -P/bin/pwd보고합니다 /tmp/foobar. 따라서 chdir("..")실패 할 경우 쉘은 다음 레벨 업 디렉토리가 무엇이라고 생각하는지 계산하고 절대적으로 거기에갑니다. (그러나 나는 그것보다 더 많은 것이 있다고 생각합니다.)


0

지금까지 토론 해 주셔서 감사합니다. 다음은 슈퍼 유저 커뮤니티 회원이 아닌 동료 직원의 설명입니다.

/tmp/strange_dir제 경우에는 NBD / VFS (Network Block Device / Virtual File System) 디렉토리입니다. 이 유형의 가상 파일 시스템은 기존 파일 시스템과 다르며 자체 셸 명령 구현이 있습니다. 따라서 디렉토리가 비어있을 때 ls -a아무것도 표시하지 않고 cd ..상위 디렉토리로 올라갈 수 있다는 것은 놀라운 일이 아닙니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.