./ 및 ../ 디렉토리는 무엇입니까?


20

간단한 질문이지만 어디서 볼지 Google이 마침표와 슬래시에 응답하지 않는지 잘 모르겠습니다.

난 그냥 (하위 폴더 / 파일을 포함하지 않음) 현재 디렉토리에있는 파일 및 디렉토리의 #을 계산하기 위해 노력하고있어 및 차별화려고 ls -1 | wc -l하고 ls | wc -l그들이 동일한 것 때문이다. 내가보고있는 사이트는 "이 디렉토리도 ./ 및 ../ 디렉토리를 계산한다는 점을 명심하십시오."라고 말했습니다. 에 대한 ls -1디렉토리를 포함하고 있는지 여부는 확실하지 않습니다. 디렉토리에 이전 디렉토리 또는 포함하지 않는 디렉토리가 포함되어 있는지 여부는 확실하지 않지만 테스트에서 그렇게하지는 않는 것 같습니다.

누군가 현재 디렉토리의 파일 및 디렉토리 수 (하위 아님)만을 계산하는 데 가장 적합한 파일 중 하나와 ./ 및 ../ 디렉토리의 의미를 확인할 수 있습니까?


"./ 및 ../ 디렉토리도 세고 있다는 것을 명심하십시오"( "."및 ".."의 오타가 아닌 한)
vonbrand

답변:


15

유닉스 시스템의 모든 디렉토리 (그리고 아마도 다른 시스템도)는 적어도 두 개의 디렉토리 엔트리를 포함합니다. 이것들은 .(현재 디렉토리)와 ..(부모 디렉토리)입니다. 루트 디렉토리의 경우, 이들은 동일한 위치를 가리 키지 만 다른 디렉토리와는 다릅니다. Linux 에서 stat, pwdcd명령을 사용하여이를 직접 확인할 수 있습니다 .

$ cd /
$ stat . .. bin sbin | grep Inode
Device: 802h/2050d      Inode: 2           Links: 27
Device: 802h/2050d      Inode: 2           Links: 27
Device: 802h/2050d      Inode: 548865      Links: 2
Device: 802h/2050d      Inode: 2670593     Links: 2
$ pwd
/
$ cd ..
$ pwd
/
$

공지 사항 binsbin각이 두 개의 링크가 있습니다. 하나는 루트 디렉토리의 디렉토리 항목이고 다른 하나는 .해당 디렉토리 내의 항목입니다.

ls파이프와 함께 사용 하는 것은 wc -lls '출력에서 라인 수를 계산하는 간단한 트릭입니다. 각 파일 또는 디렉토리는 출력에서 ​​정확히 한 줄을 차지한다고 가정합니다. GNU ls는 출력이 터미널이 아닌 경우 자동으로 수행합니다. 다른 사람들은 -1동작을 명시 적으로 켜는 옵션 이 필요할 수 있습니다 . 입력 wc -l의 라인 수 ( -l)를 단순히 계산하고 출력합니다 .

이 접근 방식의 문제점은 Linux 및 Linux에서 전통적으로 사용되는 파일 시스템에서 파일 및 디렉토리 이름 (이 점에서 실제로는 동일하고 동일 함)에 개행 문자를 포함 할 수 있다는 것 입니다. 그것들이 존재하는 경우, 두 방법 모두 분리됩니다. 실제로 그러한 항목은 하나 일 때 둘 이상의 항목으로 계산됩니다.

GNU ls를 사용하고 있고 개행 문자를 포함하는 이름을 가진 디렉토리 항목이없고 ls(예를 들어 ls -a)에 대한 별명이없는 경우 , 둘 다 현재 (또는 지정된) 디렉토리의 파일 및 디렉토리 수를 출력합니다. 대부분의 사람들에게 이것은 충분하지만 일반적인 경우에는 유효하지 않습니다 .

디렉토리 항목 이름에서 이상한 문자 (주로 개행 문자)를 올바르게 처리해야하는 경우 ls -b옵션을 사용하여 이스케이프 처리하는 것이 좋습니다 . ls -1bA각 디렉토리 항목 이름을 한 줄에 인쇄하고, 점 파일 및-디렉토리를 포함하여 특이한 문자를 피하십시오 (각 디렉토리 항목은 하나로 표시됨). 압정 wc -l의 전체 명령 라인 ls -1bA | wc -l(그러나 무시 현재 디렉토리에있는 파일 및 디렉토리의 수를보고하는 ...; 사이의 차이점 -a-A),하지만 어떤 서브 디렉토리로 내려. 도트 파일을 총계로 계산하지 않으려면 -A매개 변수를로 생략하십시오 ls.


모두 -a-A그래서 대부분에서 내가 할 것, 내가 피하려고 깨달았다 잘하는 것처럼 파일을 숨겨진 포함 ls -b | wc -l,하지만이 나에게 정답을 준다. 이 명령과 관련하여 복사하여 붙여 넣은 줄이 올바르지 않습니까? 올바른 경우 디렉토리에 6 개의 파일 또는 폴더가있을 때 8의 출력을 얻지 않아야합니까?
Adam

@Adam 네, 아마도 트릭을 할 것입니다 ( "ls -b | wc -l"); 또한 "-1"(대시 + 1 번)을 사용하면 목록을 한 줄로 묶지 않고 단일 열로 나열 할 수 있지만 다른 명령으로 파이핑 할 때 발생합니다. 그래서 (imho) 나는 그것을 "ls -1b | wc -l"로 남겨 둘 것입니다. "테스트"하려면 "ls -1b"를 실행하고 행 수를 계산 한 다음 "ls -1b | wc -l"을 실행하고 결과를 확인하십시오. (이것은 파이프를 디버그 / 테스트하는 방법입니다.)
michael

@Sardathrion, 그 FAQ는 오해의 소지가 있습니다. 유닉스 파일 시스템 규약은 "이상한"것이 아니다. 그들이 공통적 인 곳에서는 다른 시스템이 그들을 데리러 오는 것입니다. 하지만 괜찮아. 그런 다음 "file 명령은 마법의 숫자를 사용하여 ...을 식별합니다."라고 말합니다. 내 책에서 그다지 신뢰할 수는 없습니다.
vonbrand 2016 년

@vonbrand : 충분히 공평하고 링크가 삭제되었습니다. 방금 훑어 보았는데 괜찮아 보였습니다. 나는 좋은 것을 찾았지만 지금은 어디에 있는지 기억할 수 없습니다.
Sardathrion-복 직원 모니카

1
당신은 착각합니다 :. 그리고 ..는 1970 년대 유닉스의 역사적 유물이며 mkdir()아직 시스템 호출 이 없었던시기에 기인합니다 . 모든 파일 시스템에 해당 파일 시스템이있는 것은 아니며 POSIX에 필요하지도 않습니다.
schily

6

주제의 질문에 대답하려면 다음을 수행하십시오.

디렉토리 B가 Unix에서 작성되면 다른 디렉토리 A (상위 디렉토리)에 새 항목으로 추가되고 B에는 두 항목이 추가됩니다. 하나는 .자체에 대한 하드 링크라고하고 다른 하나 ..는 하드 라고 합니다. A로 연결

허용되는 디렉토리에 대한 유일한 하드 링크입니다 (일부 Unices의 일부 이전 버전에서도 임의의 링크가 허용 되었음).

그렇기 때문에 대부분의 파일 시스템에서 ( btrfs특별한 예외 임) links디렉토리 수는 하위 디렉토리 수를 나타냅니다 ( ..항목을 설명 함).

디렉토리의 이름을 바꾸거나 이동할 때 다른 디렉토리에있는 동일한 디렉토리에 있으면 이름 입력 만 A변경됩니다. B입니다 ...영향을받지 않습니다. 그러나 이동하면 다른 디렉토리를 수행하면 ..in B이 변경됩니다. 이것은 다른 디렉토리로 이동하지 않는 한 (부모 디렉토리에 대한 쓰기 액세스 권한이 있다고 가정) 쓰기 액세스 권한이없는 디렉토리의 이름을 바꿀 수있는 이유를 설명합니다 (그렇지 않으면 ..항목 을 변경할 필요가 없습니다. 당신은 그것을 이동에서).

하지만주의 : /a/b/../c동일하지 않을 수 /a/c있기 때문에 /a/b수 있습니다 상징적 다른 디렉토리에 링크.

예외는 해당 경로가 cd일부 쉘 에 대한 명령에 제공되는 경우 입니다. 그 cd들 취급하여 .. 논리적으로 무시 ..디렉토리에 항목을. 혼동과 불일치를 유발할 수 cd -P있는 기능 을 비활성화하기 위해 제대로 작성된 스크립트에서 자주 보는 이유 입니다.

제외하고 현재 디렉토리에있는 항목의 수를 계산하기 위해 ...함께 bash, 당신은 할 수 있습니다 :

shopt -s nullglob dotglob
set -- *
echo "$#"

zsh로 :

f=(*(ND))
echo $#f

포터블 :

find . ! -name . -prune -print | grep -c /

조금 혼란 스러워요. 나열된 세 가지 모두 실제 수에 하나를 추가합니다. 나는 디렉토리에있는 6 개 파일이나 폴더, 그들은 출력 7, 나에게하지 6.이있는 경우처럼 예를 들면 보인다 ls | wc -l유일한 제외입니다 ...
아담

1
@Adam, ls숨겨진 파일을 나열하지 않습니다. ls -A그것들과 동일 해야 합니다. 숨겨진 파일을 계산하지 않으려면 dotglob(bash의 경우) 또는 D(zsh의 경우)를 제거하거나 ! -name '.*'before -printfor를 추가하십시오 find.
Stéphane Chazelas

예, 실제로 파일을 나열한 후에이 사실을 알았습니다. 왜 당신은 알고 계십니까 ls | wc -l여전히 나에게 파일을 숨겨진 정답 및 제외를 제공 .& ..?
Adam

1
아담, 디렉토리에, 당신이 ., ..그리고 이름이 시작과 함께 다른 파일 .LS에 의해 표시되지 않고가 될 것이다 ls -A. 따라서 ls | wc -l숨겨진 파일을 계산하지 않기 때문에 정답을 제공하지 않습니다.
Stéphane Chazelas

1
예. .그리고 ..로 시작하므로 숨겨진 파일 .입니다. dotfiles가의 초기 구현으로 사고에 의해 숨겨져 있음을 설명하는 전설도 있습니다 ls만 제외 할 예정이었다 ..., 그러나 모든 파일로 시작 제외하는 버그가되었다 .. ls | wc -l파일 이름에 개행 문자가 포함되어 있으면 작동하지 않습니다.
Stéphane Chazelas

1

저는 훌륭한 Linux 전문가는 아니지만 16 년 전 Slackware에서 관리자로 사용 된 Linux를 알고 있습니다.

./ 및 ../ 디렉토리는 간단합니다. pwd -local directory command- 트리에서 현재 디렉토리, ..는 이전 디렉토리입니다.

그것이 그들을 세면, 나는 그들이 전체 목록에 2를 더하고, 재귀 적으로 진행하지 않고 현재 디렉토리 아래의 디렉토리를 세고 현재 디렉토리 (.) :)를 다시 계산한다고 생각합니다.)

따라서 기본적으로 현재 디렉토리의 count (files)에 값 2를 추가한다고 생각합니다.

내가 틀렸다면 누구나 나를 수정하십시오.

나는 단지 도움을주기 위해 게시하고 있으며 아무도이 질문에 대답하지 않았으며 바쁠 수 있습니다. 그러나 실험하고 10 개의 파일이 있고 12의 수를 얻는 지 확인하십시오.


네, Adrian은 맞습니다 :. 현재 디렉토리이고 ..은 계층 구조에서 바로 위에있는 디렉토리입니다.
schaiba

..가 항상 트리의 이전 디렉토리를 참조하는 것은 아닙니다. "/"에서 ..는 현재 디렉토리도 나타냅니다.
Bonsi Scott 2016 년

파일 시스템의 루트에있을 수 있기 때문에?
Adrian Tanase

디렉토리의 파일 수에 2를 추가하면 osx의 터미널에서 테스트 할 때 왜 정답을 얻습니까? 예를 들어, 6 개의 파일 또는 폴더가있는 디렉토리는 내가 할 때 8이 아니라 6을 출력합니다.ls | wc -1
Adam

나는 그들이 (즉 된 .DS_Store) 숨겨진 파일을 포함이기 때문에 그것의 실현,하지만, 난 여전히 표시되지 않습니다 ls | wc -l포함 .하고 ..내가 정답을 얻을 때 정답 + 2. 반대로,
아담
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.