programing

특정 디렉터리의 디렉터리 수 계산

mailnote 2023. 4. 26. 23:33
반응형

특정 디렉터리의 디렉터리 수 계산

특정 디렉터리의 폴더 수를 계산하는 방법.다음 명령을 사용하고 있지만 항상 추가 명령을 제공합니다.

find /directory/ -maxdepth 1 -type d -print| wc -l

예를 들어 폴더가 3개인 경우 이 명령은 4개를 제공합니다.폴더가 5개인 경우 명령어는 6개를 제공합니다.왜 그런 것일까요?

find디렉터리 자체도 인쇄하고 있습니다.

$ find .vim/ -maxdepth 1 -type d
.vim/
.vim/indent
.vim/colors
.vim/doc
.vim/after
.vim/autoload
.vim/compiler
.vim/plugin
.vim/syntax
.vim/ftplugin
.vim/bundle
.vim/ftdetect

대신 디렉터리의 하위 항목을 테스트하고 하위 항목으로 이동하지 않을 수 있습니다.

$ find .vim/* -maxdepth 0 -type d
.vim/after
.vim/autoload
.vim/bundle
.vim/colors
.vim/compiler
.vim/doc
.vim/ftdetect
.vim/ftplugin
.vim/indent
.vim/plugin
.vim/syntax

$ find .vim/* -maxdepth 0 -type d | wc -l
11
$ find .vim/ -maxdepth 1 -type d | wc -l
12

사용할 수도 있습니다.ls:

$ ls -l .vim | grep -c ^d
11


$ ls -l .vim
total 52
drwxrwxr-x  3 anossovp anossovp 4096 Aug 29  2012 after
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 autoload
drwxrwxr-x 13 anossovp anossovp 4096 Aug 29  2012 bundle
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 colors
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 compiler
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 doc
-rw-rw-r--  1 anossovp anossovp   48 Aug 29  2012 filetype.vim
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftdetect
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftplugin
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 indent
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 plugin
-rw-rw-r--  1 anossovp anossovp 2505 Aug 29  2012 README.rst
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 syntax

$ ls -l .vim | grep ^d
drwxrwxr-x  3 anossovp anossovp 4096 Aug 29  2012 after
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 autoload
drwxrwxr-x 13 anossovp anossovp 4096 Aug 29  2012 bundle
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 colors
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 compiler
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 doc
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftdetect
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftplugin
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 indent
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 plugin
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 syntax

현재 디렉터리의 디렉터리 개수만 가져옵니다.

echo */ | wc

당신은 다음과 같이 출력될 것입니다.1 309 4594

2nd digit디렉터리 수를 나타냅니다.

또는

tree -L 1 | tail -1

find . -mindepth 1 -maxdepth 1 -type d | wc -l

찾기 위해-mindepth디렉터리에 있는 총 수신자 수를 의미합니다.

-maxdepth디렉터리에 있는 총 수신자 수를 의미합니다.

-type d평균 디렉터리

그리고wc -l평균은 입력의 라인을 카운트합니다.

폴더에 디렉터리만 있고 파일이 없는 경우 다음 작업을 수행합니다.

ls | wc -l

달려.stat -c %h folder그리고 결과에서 2를 뺍니다.여기에 있는 대부분의 다른 솔루션(일반적으로)에 필요한 2개(또는 3개)의 하위 프로세스가 아닌 하나의 하위 프로세스만 사용합니다.find또는ls플러스wc).

sh/bash 사용:

echo $('stat - c %h folder' - 2) # 'filename'은 내장된 셸입니다.

csh/tcsh 사용:

cnt = 'stat - c %h folder' - 2; echo $cnt # 'folder'는 내장된 셸입니다.


설명:stat -c %h folder에서는 폴더에 대한 하드 링크 수를 인쇄하고 폴더 아래의 각 하위 폴더에는 폴더에 대한 하드 링크인 .../ 항목이 포함되어 있습니다.카운트에 두 개의 추가 하드 링크가 있으므로 2를 빼야 합니다.

  1. 폴더 자체의 자기 차별적인 ./ 입력 및
  2. 폴더의 상위 폴더 링크

드라이브로 이동하여 간단히 실행하는 가장 좋은 방법

ls -lR | grep ^d | wc -l

하위 디렉터리를 포함한 전체 폴더를 찾으시겠습니까?

find /mount/point -type d | wc -l

...또는 루트 디렉터리(하위 디렉터리 제외)의 모든 폴더를 찾으시겠습니까?

find /mount/point -maxdepth 1 -type d | wc -l

건배!

제 생각에 가장 쉬운 것은.

  ls -ld images/* | wc -l

어디에images대상 디렉터리입니다.-d 플래그는 디렉토리로 제한되며 -l 플래그는 매우 친숙한 것과 호환되는 라인별 목록을 수행합니다.wc -l라인 카운트용.

아래 명령을 사용하여 찾을 수 있는 디렉터리가 없습니다.

ls -l | grep "^d" | wc -l

몇 가지 유용한 예:

현재 dir의 파일 수

/bin/ls -lA  | egrep -c '^-'

current dir에서 dir 수

/bin/ls -lA  | egrep -c '^d'

current dir의 파일 및 dir 수

/bin/ls -lA  | egrep -c '^-|^d'

하나의 하위 디렉터리에 있는 파일 및 dir 수

/bin/ls -lA  subdir_name/ | egrep -c '^-|^d'

저는 이상한 것을 알아차렸습니다(적어도 제 경우에는).

내가 시도했을 때ls에 신대/bin/ls그자리의 -A 매변do not list implied . and ..예상대로 작동하지 않습니다.를 할 때ls / 그가.. / 그래서 그 결과는 잘못된 것입니다.솔루션:/bin/ls에 신대ls

디렉토리 수를 가져오려면 - 디렉토리로 이동하여 실행합니다.

 ls -l | grep -c ^d

순수 bash 솔루션:

shopt -s nullglob
dirs=( /path/to/directory/*/ )
echo "There are ${#dirs[@]} (non-hidden) directories"

숨겨진 디렉터리도 계산하려는 경우:

shopt -s nullglob dotglob
dirs=( /path/to/directory/*/ )
echo "There are ${#dirs[@]} directories (including hidden ones)"

디렉토리에 대한 링크도 계산됩니다.만약 당신이 그것을 원하지 않는다면, 이 방법은 조금 더 어렵습니다.


용사를 합니다.find:

find /path/to/directory -type d \! -name . -prune -exec printf x \; | wc -c

비결은 다음을 출력하는 것입니다.x합니다.wc문자 수를 계산합니다.이렇게 하면 링크를 제외한 모든 디렉토리(숨겨진 디렉토리 포함)의 수가 계산됩니다.


여기에 제시된 방법은 모두 파일 이름(공백, 줄 바꿈, 전역 문자 등)에 나타날 수 있는 재미있는 문자에 안전하게 쓸 수 있습니다.

용사를 합니다.zsh:

a=(*(/N)); echo ${#a}

N glob, null 글입니다입니다./.#수효가 있습니다.수 뿐만 아니라 반환할 수도 있습니다.0디렉터리가 없는 경우.

당신이 원하는 것에 대한 가장 좋은 대답은

echo `find . -maxdepth 1 -type d | wc -l`-1 | bc

이것은 목록을 찾는 원하지 않는 '.' 디렉터리를 제거하기 위해 하나를 뺍니다(위에서 언급한 파텔 데븐).

하위 폴더를 재귀적으로 카운트하려면 최대 깊이 옵션을 생략하십시오.

echo `find . -type d | wc -l`-1 | bc

PS 명령 대체가 못생겼다고 판단될 경우 하나를 빼는 것은 다음을 사용하여 순수 스트림으로 수행할 수 있습니다.sed그리고.bc.

카운트에서 1 빼기:

find . -maxdepth 1 -type d | wc -l | sed 's/$/-1\n/' | bc

또는 빼기 1에 카운트를 추가합니다.

find . -maxdepth 1 -type d | wc -l | sed 's/^/-1+/' | bc

모든 파일 및 하위 폴더, 창 유형:

dir=/YOUR/PATH;f=$(find $dir -type f | wc -l); d=$(find $dir -mindepth 1 -type d | wc -l); echo "$f Files, $d Folders"

정규식을 사용하려면 다음을 시도하십시오.

ls -c | grep "^d" | wc -l

folder01, folder02, folder03 등과 같은 이름을 가진 폴더를 세고 싶다면,

ls -l | grep ^d | grep -c folder

가장 좋은 방법:

ls -la | grep -v total | wc -l

이것은 당신에게 완벽한 카운트를 제공합니다.

언급URL : https://stackoverflow.com/questions/17648033/counting-number-of-directories-in-a-specific-directory

반응형