특정 디렉터리의 폴더 수를 계산하는 방법. 다음 명령을 사용하고 있지만 항상 추가 명령을 제공합니다.
find /directory/ -maxdepth 1 -type d -print| wc -l
예를 들어, 3 개의 폴더가있는 경우이 명령은 4를 제공합니다. 5 개의 폴더가 포함 된 경우 명령은 6을 제공합니다. 그 이유는 무엇입니까?
특정 디렉터리의 폴더 수를 계산하는 방법. 다음 명령을 사용하고 있지만 항상 추가 명령을 제공합니다.
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
$ ls -l .vim
PHP로? 또는 목록없이 합계 만 얻는 방법. 내 말은,이 경우에만 52
?
(ls).Count
ls -l | grep -c ^d
죽은 단순하고 작동합니다. @Pathros 아마도 PHP에서 더 좋은 방법이있을 수 있지만, PHP에서 최악의 경우 항상 shell_exec () 함수를 사용하여 명령 줄을 실행하고 결과를 문자열로 반환 할 수 있습니다. 즉 $dirCount = shell_exec('ls -l | grep -c ^d');
현재 디렉터리의 디렉터리 수만 가져옵니다.
echo */ | wc
당신은 밖으로 나올 것입니다 1 309 4594
2nd digit
아니오를 나타냅니다. 디렉토리의.
또는
tree -L 1 | tail -1
zsh: no matches found: */
nullglob 필요
echo
. 입력which echo
echo */ | wc -w
find . -mindepth 1 -maxdepth 1 -type d | wc -l
For find -mindepth
는 디렉토리의 총 수를 의미합니다.
-maxdepth
디렉토리에 영향을 미치는 총 수를 의미합니다.
-type d
디렉토리를 의미
그리고 for wc -l
는 입력의 줄을 세는 것을 의미합니다.
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"
드라이브로 이동하여 실행하는 가장 좋은 방법
ls -lR | grep ^d | wc -l
하위 디렉토리를 포함하여 전체 폴더를 모두 찾으시겠습니까?
find /mount/point -type d | wc -l
... 또는 루트 디렉터리 (하위 디렉터리 제외)에서 모든 폴더를 찾습니까?
find /mount/point -maxdepth 1 -type d | wc -l
건배!
-lR
는 점 접두사가 붙은 디렉토리를 무시한다는 점에 유의하십시오 find -type d
. 따라서 점 접두사가있는 디렉토리 (예 : .git 하위 디렉토리가 있습니다!)가있는 경우 첫 번째 명령에 의해 제공된 개수가 잘못되었습니다. -lRa
각 디렉토리 a .
및 ..
항목에 대해서도 가져 오기 때문에 단순히 사용할 수 없습니다 . @Pavel Anossov의 답변에도 적용됩니다
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를 빼야합니다.
가장 쉬운 방법은
ls -ld images/* | wc -l
images
대상 디렉토리는 어디에 있습니까 ? -d 플래그는 디렉토리로 제한되며 -l 플래그는 wc -l
행 수에 대해 매우 익숙한 것과 호환되는 행별 목록을 수행합니다 .
man ls
, -d
수행 : "목록 디렉토리 자체가 아니라 그 내용"당신이 실행하는 경우,이다 ls /tmp
, 당신은에 무엇을 얻을 것이다 /tmp
, 당신이 실행하는 경우 ls -d /tmp
를 바로 얻을 /tmp
. -d
에 대한 질문을 받았다으로 스위치는 디렉토리를 필터링하지 않습니다.
몇 가지 유용한 예 :
현재 디렉토리의 파일 수
/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
-A
do not list implied . and ..
ls
/bin/ls
ls
아래 명령을 사용하여 찾을 수있는 디렉토리가 없습니다.
ls -l | grep "^d" | wc -l
ls -l | grep ^d | wc -l
할 것, 사용할 필요가 없다 "
여기
순수한 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
문자 수를 계산하는 데 사용 하는 것입니다. 이것은 링크를 제외한 모든 디렉토리 (숨겨진 디렉토리 포함)의 수를 계산합니다.
여기에 제시된 방법은 파일 이름 (공백, 줄 바꿈, 글롭 문자 등)에 나타날 수있는 재미있는 문자에 대해 모두 안전합니다.
정규식을 사용하려면 다음을 시도하십시오.
ls -c | grep "^d" | wc -l
당신이 원하는 것에 대한 최고의 대답은
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
가장 좋은 방법 :
ls -la | grep -v total | wc -l
이것은 당신에게 완벽한 카운트를 제공합니다.
total
어떨까요? 귀하의 방법이 손상되었습니다 :(
. 구문 분석하지 마십시오ls
!