"ls -l"을 사용하여 디렉터리의 하위 디렉터리 수를 확인할 수 있나요?

"ls -l"을 사용하여 디렉터리의 하위 디렉터리 수를 확인할 수 있나요?

show 디렉터리를 사용할 때 ls -l해당 링크 수(출력의 두 번째 필드)는 최소한 2개입니다. 하나는 디렉터리 이름용이고 다른 하나는 디렉터리 이름용입니다..

$ mkdir foo
$ ls -l
total 2
drwxr-xr-x  2 user   wheel  512  4 oct 14:02 foo

2보다 큰 링크 수가 해당 디렉토리의 하위 디렉토리(링크) 수와 일치한다고 항상 가정하는 것이 안전합니까 ..?

답변1

이것은대개유닉스 시스템에서 디렉토리에 대한 링크 수는 하위 디렉토리 수에 2를 더한 값입니다. 이는 정확합니다. 그러나 다음과 같은 경우에는 그렇지 않습니다.

  • 일부 unices는 디렉토리에 대한 하드 링크를 허용합니다. 그러면 하위 디렉토리에 해당하지 않는 링크가 2개 이상 있게 됩니다.

  • .일부 파일 시스템 디렉토리 에는 및 항목이 없습니다 ... 이것GNU 찾기 매뉴얼-noleaf해당 옵션을 논의할 때( 모든 디렉토리에 존재한다고 가정되는 최적화를 비활성화하기 위해) 몇 가지 예가 언급됩니다 : "CD-ROM 또는 MS-DOS 파일 시스템 또는 AFS 볼륨 마운트 지점"...

하위 디렉터리 수를 계산하는 가장 신뢰할 수 있는 방법(파일 이름에 개행 문자가 포함되어 있으면 여전히 실패할 수 있음)은 다음과 같습니다.

$(($(LC_ALL=C ls -la /path/to/directory | grep '^d' | wc -l) - 2)

보다 안정적인 방법은 쉘 글로브를 사용하는 것입니다 */. .*/평소와 같이 패턴 불일치 상황을 처리하는 것은 약간 번거롭습니다(해당 nullglob옵션을 설정할 수 있는 bash 및 zsh에서는 제외).

답변2

Bash에서 하위 디렉터리를 계산하는 또 다른 방법(비재귀적)은 다음과 같습니다.

(
shopt -s nullglob dotglob
printf '%s\000' */ | tr -dc '\0' | wc -c  # wc counts null bytes
)

모든 파일 이름은 ASCII NUL 문자로 끝나기 때문에 파일 이름에 개행 문자가 포함되어 있어도 파일은 제대로 작동합니다.

답변3

당신은 시도 할 수 있습니다:

ls -l |grep ^d | wc -l

답변4

ls이것을 사용하지 마십시오. 적합한 방법입니다모두파일 이름은 개행 문자가 포함된 파일이라도 파일 이름이 아닌 개행 문자만 인쇄하므로 다음과 같습니다.

find . -mindepth 1 -maxdepth 1 -type d -printf '\n' | wc -l

편집: 현재 버전은 이전과 -mindepth마찬가지로 경고를 발생시키지 않습니다 (시간을 절약하기 위해 디렉터리를 확인하기 전에 디렉터리 트리를 정리합니다).-maxdepth-type

관련 정보