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


103

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

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

예를 들어, 3 개의 폴더가있는 경우이 명령은 4를 제공합니다. 5 개의 폴더가 포함 된 경우 명령은 6을 제공합니다. 그 이유는 무엇입니까?


4
현재 디렉토리 '.'로 인해 추가 1 카운트가 있습니다. , 이는 '찾기'에서도 고려됩니다.
patel deven

답변:


94

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

좋은! 어떻게 이런 짓을 했을까 $ ls -l .vimPHP로? 또는 목록없이 합계 만 얻는 방법. 내 말은,이 경우에만 52?
Pathros

하. PowerShell에 대한 주장이 BASH가 모든면에서 더 쉽다는 점이 마음에 듭니다. POSH 명령을보고 싶습니까? (ls).Count
Kolob Canyon

@Pathros GLOB_ONLYDIR 플래그와 함께 glob 을 사용 하고 결과를 count ()합니다.
Pilipe

1
ls -l | grep -c ^d죽은 단순하고 작동합니다. @Pathros 아마도 PHP에서 더 좋은 방법이있을 수 있지만, PHP에서 최악의 경우 항상 shell_exec () 함수를 사용하여 명령 줄을 실행하고 결과를 문자열로 반환 할 수 있습니다. 즉 $dirCount = shell_exec('ls -l | grep -c ^d');
기가 바이트

66

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

echo */ | wc

당신은 밖으로 나올 것입니다 1 309 4594

2nd digit아니오를 나타냅니다. 디렉토리의.

또는

tree -L 1 | tail -1


8
불행히도 dir 이름에 공백이 있으면 실패합니다.
Michael Campbell

zsh: no matches found: */nullglob 필요
Anne van Rossum

@AnnevanRossum 가지고 계십니까 echo. 입력which echo
EmptyData

7
첫 번째는 조금 더 개선 될 수 있습니다.echo */ | wc -w
ibic

0 대신 디렉토리가 없으면 1로 계산됩니다.
jinawee

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

For find -mindepth는 디렉토리의 총 수를 의미합니다.

-maxdepth 디렉토리에 영향을 미치는 총 수를 의미합니다.

-type d 디렉토리를 의미

그리고 for wc -l는 입력의 줄을 세는 것을 의미합니다.


2
답변을 설명해 주시겠습니까?
Zulu

-mindepth 수단 디렉토리의 총 수의 recusive, -maxdepth 수단 디렉토리의 총 수의 recusive, 타입 D 수단 디렉토리 및 목록 주어진 디렉토리에서 화장실 -l 수단의 라인 카운트
shiyani 수레 쉬

find . -mindepth 1 -maxdepth 1 -type d | wc -l숫자 사이에 많은 공백이 있습니다. 예 :` dir_count=`find . -maxdepth 1 -type d | wc -l | xargs`; echo $dir_count # will print just 2 if (( $dir_count > 1 )); then echo "Yaa"; fi # will print "Yaa"
2`

16

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

ls | wc -l

2
이것은 파일도 가져 오지만 문제는 폴더 / 디렉토리에 관한 것이 었습니다.
Robert

12

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

ls -lR | grep ^d | wc -l

하위 디렉토리를 포함하여 전체 폴더를 모두 찾으시겠습니까?

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

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

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

건배!


이전 ls -lR는 점 접두사가 붙은 디렉토리를 무시한다는 점에 유의하십시오 find -type d . 따라서 점 접두사가있는 디렉토리 (예 : .git 하위 디렉토리가 있습니다!)가있는 경우 첫 번째 명령에 의해 제공된 개수가 잘못되었습니다. -lRa각 디렉토리 a ...항목에 대해서도 가져 오기 때문에 단순히 사용할 수 없습니다 . @Pavel Anossov의 답변에도 적용됩니다
marcz

12

stat -c %h folder결과에서 2를 실행 하고 뺍니다. 여기에서는 대부분의 다른 솔루션 (일반적으로 find더하기 wc)에 필요한 2 개 (또는 3 개)와 달리 단일 하위 프로세스 만 사용합니다 .

sh / bash 사용 :

cnt = $ ((`stat -c % h folder`-2))
echo $ cnt # 'echo'는 추가 프로세스가 아닌 sh / bash 내장입니다.

csh / tcsh 사용 :

@ cnt =`stat -c % h folder`-2
echo $ cnt # 'echo'는 추가 프로세스가 아닌 csh / tcsh 내장입니다.


설명 : stat -c %h folder에 하드 링크의 수 출력 폴더를 , 그리고 아래의 각 하위 폴더 에 하드 링크 다시하는 ../ 항목이 포함되어 폴더를 . 개수에 두 개의 추가 하드 링크가 있으므로 2를 빼야합니다.

  1. 폴더 의 자체 참조 ./ 항목 및
  2. 폴더 의 상위 폴더 링크

이 질문과 관련이 있습니다. [새 디렉토리에 추가하기 전에 왜 새 디렉토리의 하드 링크 수가 2입니까? ] ( unix.stackexchange.com/questions/101515 ) 이것이 왜 훌륭한 대답인지 설명합니다. 불행히도 이것은 충분한 관심을받지 못했습니다! 좋은 대답이지만 그 결과는 안타깝게도 파일 시스템에 따라 다르지만 대부분의 일반적인 파일 시스템에서는 작동합니다.
kvantour

8

가장 쉬운 방법은

  ls -ld images/* | wc -l

images대상 디렉토리는 어디에 있습니까 ? -d 플래그는 디렉토리로 제한되며 -l 플래그는 wc -l행 수에 대해 매우 익숙한 것과 호환되는 행별 목록을 수행합니다 .


또한 결과 +1
josef

1
에 따르면 man ls, -d수행 : "목록 디렉토리 자체가 아니라 그 내용"당신이 실행하는 경우,이다 ls /tmp, 당신은에 무엇을 얻을 것이다 /tmp, 당신이 실행하는 경우 ls -d /tmp를 바로 얻을 /tmp. -d에 대한 질문을 받았다으로 스위치는 디렉토리를 필터링하지 않습니다.
Robert

5

몇 가지 유용한 예 :

현재 디렉토리의 파일 수

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

현재 디렉토리에서 dirs를 계산

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

현재 디렉토리의 파일 및 디렉토리 계산

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

하나의 하위 디렉토리에있는 파일 및 디렉토리 개수

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

나는 이상한 것을 발견했습니다 (적어도 제 경우에는) :

내가 함께 노력했으면 ls대신 매개 변수 NOT WORK espected한다. 그 쇼 ./ 및 ../ 사용하면 결과가 잘못 계산됩니다. 해결책 : 대신/bin/ls-Ado not list implied . and ..ls/bin/lsls


4

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

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


그냥 ls -l | grep ^d | wc -l할 것, 사용할 필요가 없다 "여기
kaspiotr

3

순수한 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디렉토리를 찾을 때마다 stdout 에 출력 한 다음 wc문자 수를 계산하는 데 사용 하는 것입니다. 이것은 링크를 제외한 모든 디렉토리 (숨겨진 디렉토리 포함)의 수를 계산합니다.


여기에 제시된 방법은 파일 이름 (공백, 줄 바꿈, 글롭 문자 등)에 나타날 수있는 재미있는 문자에 대해 모두 안전합니다.


이것은이 질문에 제시된 최상의 솔루션이며 항상 작동합니다!
kvantour

3

사용 zsh:

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

N하는 nullglob이다 /는 디렉토리와 일치하게 #수를. 디렉토리 이름의 공백을 깔끔하게 처리하고 디렉토리 0가 없으면 반환 합니다.


0

모든 파일 및 하위 폴더, Windows 스타일 계산 :

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

0

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

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

1
코드 전용 답변에 설명을 추가 하시겠습니까? StackOverflow가 무료 코드 작성 서비스라는 오해와 싸우는 데 도움이 될 것입니다. 또한 모양을 개선하려면 여기를보십시오 : stackoverflow.com/editing-help
Yunnosch

0

당신이 원하는 것에 대한 최고의 대답은

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

원치 않는 '.'를 제거하기 위해 하나를 뺍니다. 목록을 찾는 디렉토리 (위에서 언급 한 patel deven).

하위 폴더를 재귀 적으로 계산하려면 maxdepth 옵션을 그대로 두십시오.

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

추신 : 명령 대체가 이상하다고 생각되면 sed및을 사용하여 순수 스트림으로 하나를 뺄 수 있습니다 bc.

개수에서 하나 빼기 :

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

또는 마이너스 1에 개수 추가 :

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

-1

가장 좋은 방법 :

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

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


6
당신은 그것을하는 더 나쁜 방법을 의미합니다! 게다가 이것은 디렉토리 수를 계산하지 않습니다 . 그리고 문자열을 포함하는 디렉토리 이름이 있다면 total어떨까요? 귀하의 방법이 손상되었습니다 :(. 구문 분석하지 마십시오ls !
gniourf_gniourf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.