각 디렉토리의 파일 수를 계산하는 방법은 무엇입니까?


105

모든 디렉토리를 다음과 같이 나열 할 수 있습니다.

find ./ -type d

다음 명령을 사용하여 각 디렉터리의 내용을 나열하고 각 디렉터리의 파일 수를 계산하려고했습니다.

find ./ -type d | xargs ls -l | wc -l

그러나 이것은 반환 된 총 줄 수를 합산했습니다.

find ./ -type d | xargs ls -l

각 디렉토리의 파일 수를 계산할 수있는 방법이 있습니까?


바로 아래에있는 각 하위 디렉터리의 파일 수를 계산하는 방법을 찾고 ./있습니까?
Tuxdude 2013 년

5
이게 주제에서 벗어난 질문은 어때 ?? 이유가있는 유권자 댓글을보고 싶습니다! 이것이 주제에서 벗어난 경우 어디에 속합니까? 슈퍼 유저? 나는 그렇게 생각하지 않는다 ..
InfantPro'Aravind '

6
쉘 스크립트, 배치 스크립트는 프로그래밍 범위에 속합니다!
InfantPro'Aravind '2013 년

Pythonic 솔루션을 게시하려고했는데 질문이 닫혔다는 것을 알았습니다.
anatoly techtonik 2013

다시 열기로 투표했습니다. 많은 상황에서 유용 할 수있는 다른 답변이있을 수 있습니다 (이 질문에 도달 한 이유 인 스크립트 프로그래밍 포함).
lepe 2014-07-25

답변:


110

GNU find가 있다고 가정하면 디렉토리를 찾고 bash가 나머지를 수행합니다.

find . -type d -print0 | while read -d '' -r dir; do
    files=("$dir"/*)
    printf "%5d files in directory %s\n" "${#files[@]}" "$dir"
done

2
위와 약간 다른 버전이므로 : (힌트 : 이름과 csv로 정렬 됨) for x in find . -maxdepth 1 -type d | sort; 할 y = find $x | wc -l; echo $ x, $ y; 완료
pcarvalho 2013 년

5
훌륭합니다! 한 줄에 넣기 (셸에서 직접 사용하기에 find . -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in directory %s\n" "${#files[@]}" "$dir"; done
편리함

13
각 하위 디렉터리에있는 모든 파일의 수 (재귀 적으로 계산)를 가져와야했습니다. 이 수정은 다음을 제공합니다. find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find $dir -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
OmidS 2015

1
@Kory 다음은 그것을 할 것입니다 :find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done | sort -rn -k1
OmidS

1
@OmidS 훌륭한 oneliner이지만 $dir공백이있는 dir 이름을 올바르게 처리하려면 첫 번째 주석의 따옴표 안에 있어야합니다. :find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
Radek Daniluk

183

현재 디렉터리 수준에 대한 디렉터리 당 파일 수를 인쇄합니다.

du -a | cut -d/ -f2 | sort | uniq -c | sort -nr

9
최상위 디렉토리의 파일 수를 재귀 적으로 나열하려는 경우 가장 좋은 (가장 우아한) 솔루션입니다.
itoctopus

13
여기에는 두 가지 문제가 있습니다. 실제로 존재하는 것보다 디렉토리 당 하나의 파일을 세고 현재 디렉토리의 크기를 "1 size " 로 포함하는 쓸모없는 줄을 제공합니다 . 둘 다 du -a | sed '/.*\.\/.*\/.*/!d' | cut -d/ -f2 | sort | uniq -c. | sort -nr디렉토리 이름 대신 개수별로 정렬하려면 추가하십시오 .
디저트

3
나는 이것이 OSX에서도 작동한다는 것을 지적하고 싶습니다. (그냥 OSX 쉘에 리눅스 조언을-붙여 복사하는 것은 보통 일을하지 않습니다.)
Pistos

2
du -a에 의해 불필요한 크기를 가져옵니다. 더 나은 방법은 찾기 명령을 사용하는 것입니다. 하지만 주요 아이디어는 똑같습니다. :)
Znik

5
찾기 . 유형 f | 컷 -d / -f2 | 정렬 | uniq -c | 종류 -nr # 수정 문제는 디저트 언급
jcomeau_ictx

28
find . -type f | cut -d/ -f2 | sort | uniq -c
  • find. -type f 유형 파일의 모든 항목을 찾으려면
  • cut -d/ -f2 특정 폴더를 잘라내려면
  • sort 폴더 이름 목록을 정렬하려면
  • uniq -c 각 폴더 이름이 계산 된 횟수를 반환합니다.

8
최상위 디렉토리의 요약을 얻을 수 있으므로 허용되는 답변보다 훨씬 낫습니다!
제이슨 플로이드

3
이것은 받아 들여진 대답이어야합니다. 간단하고 이해하기 쉽습니다.
xssChauhan

1
받아 들여 져야 할 가장 좋은 대답은 이것입니다.
loretoparisi

1
간단하고 우아하며 내 요구에 완벽합니다.
RichR

완전한. 또한 필드 지정자를 필드 지정자 목록으로 대체하여 하위 디렉터리 개수로 확장 할 수 있습니다. 예 :find . -type f | cut -d/ -f2,3 | sort | uniq -c
algal

15

모든 파일을 찾고, 파일 이름을 제거하고, 각 파일의 디렉토리 이름 만 포함 된 행을 남겨두고, 각 디렉토리가 나타나는 횟수를 세도록 정렬 할 수 있습니다.

find . -type f |
sed 's%/[^/]*$%%' |
sort |
uniq -c

유일한 문제는 개행 문자를 포함하는 파일 이름이나 디렉토리 이름이있는 경우입니다. 파일 이름이나 디렉토리 이름에서 줄 바꿈에 대해 정말로 걱정해야한다면, 그들을 찾아서 수정하여 줄 바꿈을 포함하지 않도록 수정하십시오 (그리고 그들의 방식에 오류가 있다는 죄인을 조용히 설득).


현재 디렉터리의 각 하위 디렉터리에있는 파일 수에 관심이 있고 하위 디렉터리의 모든 파일과 직접 하위 디렉터리에있는 파일을 계산하는 데 관심이 있다면 sed명령을 인쇄 전용으로 조정합니다. 최상위 디렉토리 :

find . -type f |
sed -e 's%^\(\./[^/]*/\).*$%\1%' -e 's%^\.\/[^/]*$%./%' |
sort |
uniq -c

첫 번째 패턴은 이름의 시작, 점, 슬래시, 다음 슬래시까지의 이름 및 슬래시를 캡처하고 행을 첫 번째 부분으로 만 바꿉니다.

./dir1/dir2/file1

대체된다

./dir1/

두 번째 교체는 현재 디렉토리에서 직접 파일을 캡처합니다. 끝에 슬래시가 없으며 ./. 그런 다음 정렬 및 개수는 이름 수에만 적용됩니다.


1
이것은 파일을 포함하지 않는 디렉토리 이름을 출력하지 않습니다. 이것이 필요한지 확실하지 않습니다.
Austin Phillips

사실, 그렇지 않습니다. 빈 디렉토리 이름이 .NET의 출력에 나타날 수도 있다는 보장이 없기 때문에 그렇게하기 위해 고치는 것은 그리 간단하지 않습니다 find. 일부는 다음과 같습니다. 파일 dir1/dir2/dir3/file1이 있지만 dir1/dir2하위 디렉토리 만 포함 (일반 파일 없음)하면 해당 존재를 유추 할 수 있습니다. 그러나 dir1/dir4파일이 없으면 이름이 표시되지 않습니다.
Jonathan Leffler 2013 년

현재 디렉토리의 하위 디렉토리 만보고 싶은 경우 매우 유용한 답변입니다.
xixixao

고마워하기 위해 들렀습니다. 이것이 게시 된 지 3 년 후, 저는 폴더 당 2 단계 폴더를 계산하려고했습니다. 귀하의 게시물이 나오지 땜질의 나에게 잠재적으로 많은 시간을 저장, 발견하고 누가 어떤 다른 알
코르

13

여기에 한 가지 방법이 있지만 아마도 가장 효율적인 방법은 아닙니다.

find -type d -print0 | xargs -0 -n1 bash -c 'echo -n "$1:"; ls -1 "$1" | wc -l' --

디렉토리 이름 뒤에 해당 디렉토리의 항목 수와 함께 다음과 같은 출력을 제공합니다. 출력 수에는 원하는 것과 다를 수있는 디렉토리 항목도 포함됩니다.

./c/fa/l:0
./a:4
./a/c:0
./a/a:1
./a/a/b:0

그것은 3 개 명령 (실행하는 데 매우 비싼 것 bash, ls, wc에 의해 발견 된 각 디렉토리를) find.
Jonathan Leffler 2013 년

@JonathanLeffler 동의하므로 내 대답의 첫 번째 줄입니다. 귀하의 솔루션이 더 좋습니다.
Austin Phillips

멋지다 이것이 내가 찾고있는 것입니다. 마지막에 '-'가 무엇인지 물어봐도 될까요?
한 번

1
@once는-xargs에 의해 생성 될 bash 명령에 속합니다. 에서 man bash, A -- signals the end of options and disables further option processing. 이 경우, 찾기의 일부로 발견 된 이름이 잘못된 파일이 bash에 대한 인수 처리의 일부가되는 것을 방지합니다.
Austin Phillips

8

다른 모든 사람의 솔루션에는 한 가지 단점이 있습니다.

find -type d -readable -exec sh -c 'printf "%s " "$1"; ls -1UA "$1" | wc -l' sh {} ';'

설명:

  • -type d: 우리는 디렉토리에 관심이 있습니다.
  • -readable: 파일을 나열 수있는 경우에만 필요 합니다. 참고 find가 그들 이상의 디렉토리를 검색 할 때 여전히 오류를 방출하지만, 호출이 방지 -exec그들을 위해.
  • -exec sh -c BLAH sh {} ';'각 디렉토리와,이 스크립트 조각을 실행 $0으로 설정 sh하고 $1파일 이름으로 설정합니다.
  • printf "%s " "$1": 디렉토리 이름을 이식 가능하고 최소한으로 인쇄하고 그 뒤에 개행이 아닌 공백 만 표시합니다.
  • ls -1UA: 파일을 한 줄에 하나씩 디렉터리 순서로 나열합니다 (파이프 중단 방지) . 특수 디렉터리 제외 .하고..
  • wc -l: 줄 수

1
수정은 라인에 먼저 파일의 수를 표시하고, 그들에 의해 정렬 :find -type d -readable -exec sh -c 'ls -1UA "$1" | wc -l | tr -d "\n" ; printf "\t%s\n" "$1" ' sh {} ';' | sort -n
예브게니 Sergeev

쉘을 여러 번 실행 한 다음 느리고 리소스를 많이 사용합니다.
Znik

6

( 수행해야하고 결코 사용되지 않는 파일 크기 관련 오버 헤드를 제외하기 위해) 대신 사용 하는 Sebastian의 대답 약간 수정 된 버전 :finddudu

 find ./ -mindepth 2 -type f | cut -d/ -f2 | sort | uniq -c | sort -nr

-mindepth 2매개 변수는 현재 디렉토리의 파일을 제외하는 데 사용됩니다. 제거하면 다음과 같은 줄이 표시됩니다.

  234 dir1
  123 dir2
    1 file1
    1 file2
    1 file3
      ...
    1 fileN

( du기반 변형 과 매우 유사 )

현재 디렉토리에있는 파일도 계산해야하는 경우이 향상된 버전을 사용하십시오.

{ find ./ -mindepth 2 -type f | cut -d/ -f2 | sort && find ./ -maxdepth 1 -type f | cut -d/ -f1; } | uniq -c | sort -nr

출력은 다음과 같습니다.

  234 dir1
  123 dir2
   42 .

5

find 대신 ls를 반복하여 수행 할 수도 있습니다.

for f in */; do echo "$f -> $(ls $f | wc -l)"; done

설명:

for f in */; -모든 디렉토리를 반복

do echo "$f -> -각 디렉토리 이름 인쇄

$(ls $f | wc -l) -이 디렉토리에 대해 ls를 호출하고 행을 계산합니다.


1
디렉토리 이름에 공백이 있으면 제대로 작동하지 않습니다.
Xylol 2017-10-05

시도for f ./* ; do echo $f $(ls "$f" | wc -l); done
4ndt3s

3

이것은 디렉토리 이름 뒤에 디렉토리의 파일 수를 반환해야합니다.

findfiles() {
    echo "$1" $(find "$1" -maxdepth 1 -type f | wc -l)
}

export -f findfiles

find ./ -type d -exec bash -c 'findfiles "$0"' {} \;

출력 예 :

./ 6
./foo 1
./foo/bar 2
./foo/bar/bazzz 0
./foo/bar/baz 4
./src 4

export -f때문에 필요 -exec의 인수가 find명시 적으로 bash에있는 invoke 당신이하지 않는 떠들썩한 기능을 실행 할 수 없습니다, 당신은 명시 적으로 새로운 쉘에 현재 범위에 정의 된 함수를 export 할 필요가있다.


이것은 지나치게 복잡해 보입니다. 또한 다음과 같은 디렉토리 계층 구조에 대한 누적 카운트를 제공하는 것처럼 보입니다 ./dir1/dir2/dir3(의 파일 dir1과 파일을 dir1/dir2/dir3별도로 계산 dir1/dir2하고 둘 다 의 파일과 별도로 계산하는 대신 포함 된 파일과 하위 디렉터리를 모두 함께 계산 /dir1).
Jonathan Leffler 2013 년

나는 그것이 저자가 원했던 것이라고 이해했습니다. 그렇지 않은 경우 답변이 질문과 관련이 없다는 데 동의합니다.
Tuxdude 2013 년

1
@JonathanLeffler-좋아요, 다시 한 번 질문을 읽고, 당신이 옳다는 것을 깨달았습니다-그에 따라 대답을 수정했습니다.
Tuxdude 2013 년

2

@glenn jackman의 답변 과 @pcarvalho의 답변을 결합 했습니다 (주석 목록에서 문자 ' ` '(backtick) 의 추가 스타일 제어 기능 때문에 pcarvalho의 답변에 문제가 있습니다 ).

내 스크립트는 경로를 augument로 받아들이고 디렉토리 목록을로 정렬 할 수 있으며 "파일 이름의 공백"문제ls -l처리 할 수 ​​있습니다 .

#!/bin/bash
OLD_IFS="$IFS"
IFS=$'\n'
for dir in $(find $1 -maxdepth 1 -type d | sort); 
do
    files=("$dir"/*)
    printf "%5d,%s\n" "${#files[@]}" "$dir"
done
FS="$OLD_IFS"

stackoverflow의 첫 번째 답변이며 누군가에게 도움이되기를 바랍니다 ^ _ ^


1

찾기 . -type f -printf '% h \ n'| 정렬 | 유니크 -c

예를 들면 다음과 같습니다.

  5 .
  4 ./aln
  5 ./aln/iq
  4 ./bs
  4 ./ft
  6 ./hot

0

여기에서 다른 일부를 시도했지만 파일 만 원할 때 파일 수에 하위 폴더가 포함되었습니다. ./folder/path<tab>nnn현재 폴더의 각 하위 폴더에 대해 하위 폴더를 포함하지 않고 파일 수와 함께 인쇄 됩니다.

for d in `find . -type d -print` 
do 
  echo -e "$d\t$(find $d -maxdepth 1 -type f -print | wc -l)"
done

0

주어진 유형의 파일을 재귀 적으로 찾는 쉬운 방법. 이 경우 현재 디렉토리의 모든 폴더에 대한 .jpg 파일 :

find . -name *.jpg -print | wc -l


0

디렉토리의 이미지 수를 계산하고 이미지 확장자별로 출력을 구성하기 위해 파일을 재귀 적으로 탐색하는 초고속 기적 명령 :

find . -type f | sed -e 's/.*\.//' | sort | uniq -c | sort -n | grep -Ei '(tiff|bmp|jpeg|jpg|png|gif)$'

크레딧 : https://unix.stackexchange.com/a/386135/354980


0

이것은 디렉토리 구조를 탐색하고 깊이있는 결과를 제공하는 또 다른 방법 일 수 있습니다.

find . -type d  | awk '{print "echo -n \""$0"  \";ls -l "$0" | grep -v total | wc -l" }' | sh 

0

node_modules분석 된 디렉토리 내의 모든 디렉토리 를 제외하기 위해 스크립트를 편집했습니다 .

프로젝트 파일 수가 파일 감시자가 처리 할 수있는 최대 수를 초과하는지 확인하는 데 사용할 수 있습니다.

find . -type d ! -path "*node_modules*" -print0 | while read -d '' -r dir; do
    files=("$dir"/*)
    printf "%5d files in directory %s\n" "${#files[@]}" "$dir"
done

시스템에서 볼 수있는 최대 파일을 확인하려면 :

cat /proc/sys/fs/inotify/max_user_watches

node_modules 느린 시스템에서 IDE / 편집기 제외 경로에 폴더를 추가해야하며 다른 파일 수는 이상적으로 최대 값을 초과하지 않아야합니다 (변경 가능).


-1

이것은 전체 개수를 제공합니다.

for file in */; do echo "$file -> $(ls $file | wc -l)"; done | cut -d ' ' -f 3| py --ji -l 'numpy.sum(l)'

아닙니다. 한 수준의 하위 디렉터리 만 고려합니다.
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.