간단한 질문이지만 어디를 봐야 할지 모르겠습니다. Google은 마침표와 슬래시에 응답하지 않습니다.
현재 디렉터리(하위 폴더/파일 제외)에 있는 파일과 디렉터리의 수를 세고 동일해 보이기 ls -1 | wc -l
때문에 이들을 구별하려고 합니다 . ls | wc -l
내가 보던 한 웹사이트는 이렇게 말했다."여기에는 ./ 및 ../ 디렉터리도 포함된다는 점을 기억하세요."에 관해서는 ls -1
그것이 이전 디렉토리나 (내가 원하지 않는) 것을 포함한다는 것을 의미하는지 확실하지 않지만 테스트를 통해 그렇게 하지 않는 것 같습니다.
현재 디렉터리(하위 디렉터리 아님)에 있는 파일 및 디렉터리 수만 계산하는 데 가장 적합한 것이 무엇인지, 그리고 ./ 및 ../ 디렉터리가 무엇을 의미하는지 확인할 수 있는 사람이 있나요?
답변1
Unix 시스템(및 아마도 다른 모든 시스템)의 모든 디렉토리에는 최소한 두 개의 디렉토리 항목이 포함되어 있습니다. .
(현재 디렉터리)와 ..
(상위 디렉터리) 입니다 . 루트 디렉터리의 경우 동일한 위치를 가리키지만 다른 디렉터리의 경우에는 다릅니다. Linux에서 stat
, 및 명령을 사용하여 pwd
직접 확인할 수 있습니다 .cd
$ 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
/
$
bin
각 링크 에는 sbin
두 개의 링크가 있습니다. 하나는 루트 디렉토리의 디렉토리 항목이고 다른 하나는 .
해당 디렉토리 내의 항목입니다.
ls
파이프를 사용하는 것은 wc -l
ls 출력의 행 수를 계산하는 간단한 방법입니다. 각 파일이나 디렉터리는 출력에서 정확히 한 줄을 차지한다고 가정합니다. GNU ls는 출력이 비터미널일 때 자동으로 이를 수행합니다. 다른 사람들은 -1
이 동작에 대한 옵션을 명시적으로 켜야 할 수도 있습니다. 입력( )의 wc -l
행 수를 계산하고 출력하면 됩니다.-l
이 접근 방식의 문제점은 Linux와 Linux에서 전통적으로 사용되는 파일 시스템에서 파일 이름과 디렉터리 이름(이 경우 실제로는 하나이며 동일함)이 다음과 같다는 것입니다.개행 문자 허용. 두 가지 방법 모두 이러한 항목이 있으면 작동하지 않습니다. 항목은 실제로는 하나인데도 둘 이상의 항목으로 계산됩니다.
ls
GNU ls를 사용하는 한 이름에 새 줄이 포함된 디렉터리 항목이 없고 이상한 별칭 (예: ) 도 없으며 ls -a
둘 다 현재(또는 지정된) 디렉터리에 있는 파일과 디렉터리의 수를 출력합니다. 대부분의 사람들에게는 이것으로 충분하지만 실제로는 작동하지 않습니다.일반적인사례.
디렉토리 항목 이름에서 특이한 문자(주로 줄 바꿈)를 올바르게 처리해야 하는 경우 -b
ls 옵션을 사용하여 이스케이프하는 것이 좋습니다. ls -1bA
각 디렉토리 항목 이름은 점 파일 및 디렉토리를 포함하여 특이한 문자를 이스케이프하여 자체 줄에 인쇄됩니다(따라서 각 디렉토리 항목은 하나로 처리됩니다). 현재 디렉터리에 있는 파일 및 디렉터리 수를 보고하는 wc -l
완전한 명령줄을 추가하지만 (및 은 무시합니다 . 이는 과 의 차이점입니다) 하위 디렉터리에는 포함되지 않습니다. 포인트 파일이 총계에 포함되는 것을 원하지 않으면 인수를 생략하면 됩니다.ls -1bA | wc -l
.
..
-a
-A
-A
ls
답변2
주제의 질문에 답하십시오.
Unix에서 디렉토리 B가 생성되면 다른 디렉토리 A(상위)에 새 항목으로 추가되고 B에 두 개의 항목이 추가됩니다. 하나는 .
자신에 대한 하드 링크라고 하고 다른 하나는 ..
자신이라고 합니다. ㅏ.
이는 허용되는 유일한 디렉토리 하드 링크입니다(일부 이전 버전의 Unices도 임의 링크를 허용했지만).
이것이 바로 대부분의 파일 시스템에서( btrfs
주목할 만한 예외임) 디렉토리 번호가 links
하위 디렉토리 수를 나타내는 이유입니다(해당 항목 설명 ..
).
디렉토리의 이름을 바꾸거나 이동할 때 A
동일한 디렉토리에 있는 경우(다른 이름으로) 이름 항목만 변경됩니다. B .
와는 ..
영향을 받지 않습니다. 그러나 다른 디렉토리로 옮기면 ..
in이 B
변경됩니다. 이는 쓰기 권한이 없는 디렉토리(상위 디렉토리에 대한 쓰기 권한이 있다고 가정)의 이름을 다른 디렉토리로 이동하지 않는 한(그렇지 않으면 항목을 변경해야 하는 경우) 이름을 바꿀 수 있는 이유를 설명합니다 ..
. 움직이지 못하게 하세요).
하지만 참고하세요: might는 may be 와 /a/b/../c
다릅니다 ./a/c
/a/b
상징적인다른 디렉토리에 대한 링크.
한 가지 예외는 경로가 cd
특정 셸 명령에 할당된 경우입니다. 그 cd
치료법..
논리적으로..
디렉터리의 항목을 무시합니다 . 적절하게 작성된 스크립트에서 자주 볼 수 있는 이유 중 하나 cd -P
는 해당 기능을 비활성화하는 것입니다.특징그렇지 않으면 혼란과 불일치가 발생할 수 있습니다.
.
sum 을 제외한 현재 디렉터리의 ..
항목 수를 계산하려면 bash
다음을 수행할 수 있습니다.
shopt -s nullglob dotglob
shopt -u failglob
set -- *
echo "$#"
zsh 사용:
f=(*(ND))
echo $#f
또는 익명 함수를 한 번 사용하고 정렬을 최적화로 비활성화합니다.
(){echo $#} *(NDoN)
가지고 다닐 수 있는:
find . ! -name . -prune -print | grep -c /
답변3
저는 훌륭한 Linux 전문가는 아니지만 Linux를 알고 있습니다(16년 전 Slackware의 관리자였습니다 :) 좋았던 시절
./ 및 ../ 디렉토리는 간단합니다. 이들은 현재 디렉토리이고 ..는 이전 디렉토리입니다(pwd -local 디렉토리 명령 트리에서 -
계산해 보면 실제로 현재 디렉터리 아래의 디렉터리를 재귀적으로 계산하고 현재 디렉터리를 다시 계산하는 것이 아니라 목록 전체에 2를 추가하는 것 같습니다(.) :))
그래서 기본적으로 현재 디렉터리에서 이미 계산된 (파일)에 값 2를 추가한다고 생각합니다.
내가 틀렸다면 누구든지 나를 고칠 수 있습니까?
도움을 드리고자 글을 올렸는데 여기 아무도 이 질문에 답변하지 않았네요. 바쁠 수도 있습니다. 하지만 실험을 통해 파일이 10개 있고 개수가 12개인지 확인하면 충분합니다.