디렉토리를 통해 모든 파일을 재귀 적으로 계산하는 방법


47

하위 디렉토리에 얼마나 많은 파일이 있는지 확인하고 모든 inode 사용법이 시스템에서 어디에 있는지 확인하고 싶습니다. 나는 공간 사용을 위해 이것을하는 것처럼

du -sh /*

루트가 아닌 디렉토리에서 사용되는 공간을 제공하지만이 경우 크기가 아닌 파일 수를 원합니다.



"하위 디렉토리에있는 서브 디렉토리에있는 파일 수"는 혼란스러운 구성이라고 생각합니다. 원하는 것을 더 명확하게 진술하면 청구서에 맞는 답변을 얻을 수 있습니다.
Steven D

@Steven은 자유롭게 다시 쓸 수 있습니다 ... 나는 내 예제를 du -sh /*통해 카운트가 어떻게 작동하기를 원했는지 명확하게 생각 했습니다. 같은 것, 바이트가 아닌 파일을 계산하십시오.
xenoterracide

inode 사용에 대해 언급했듯이 파일 수 또는 사용 된 inode 수를 계산할지 여부를 이해할 수 없습니다. 파일 시스템에 하드 링크가 있으면 두 가지가 다릅니다. 전부는 아니지만 대부분의 대답은 파일 수를 나타냅니다. Apple Time Machine 백업 디스크에서 사용하지 마십시오.
mouviciel

@mouviciel 이것은 백업 디스크에서 사용되지 않으며 예, 서로 다를 것이라고 생각하지만 환경에는 하드 링크가 거의 없으므로 기술적으로 느낌이 필요합니다. 누군가 inode 할당량을 태우는 위치를 파악하십시오.
xenoterracide

답변:


60
find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

안전 / 호환성 수정을위한 Gilles 및 xenoterracide에게 감사합니다.

첫 번째 부분 : find -maxdepth 1 -type d현재 작업 디렉토리의 모든 디렉토리 목록을 반환합니다. 이것은 파이프입니다 ...

두 번째 부분 : while read -r dir; dowhile 루프 시작 – while으로 들어오는 파이프가 열려있는 동안 (전체 디렉토리 목록이 전송 될 때까지) read 명령은 다음 행을 변수 "dir"에 넣습니다. 그런 다음 계속됩니다 ...

세 번째 부분 : printf "%s:\t" "$dir";"$ dir"(디렉토리 이름 중 하나를 보유)에 문자열을 인쇄 한 다음 탭을 표시합니다.

네 번째 부분 : find "$dir -f file""$ dir"에있는 디렉토리 이름 내의 모든 파일 목록을 만듭니다. 이 목록은 다음 주소로 전송됩니다.

다섯 번째 부분 : wc -l;표준 입력으로 전송 된 라인 수를 계산합니다.

마지막 부분 : donewhile 루프를 종료합니다.

따라서 현재 디렉토리의 모든 디렉토리 목록을 얻습니다. 이러한 각 디렉토리에 대해 모든 파일 목록을 생성하여를 사용하여 모두 계산할 수 있습니다 wc -l. 결과는 다음과 같습니다.

./dir1: 234
./dir2: 11
./dir3: 2199
...

항상 백 슬래시를 특수 처리 read -r하는 일반 read처리 로 사용하십시오 . 그런 다음 echo -en "$dir:\t"다시 백 슬래시를 엉망으로 만듭니다. 간단한 수정은 printf '%s:\t' "$dir"대신 사용하는 것입니다. 다음으로 $dir해야합니다 "$dir"( 항상 변수 대체에 큰 따옴표를 사용하십시오 ).
Gilles 'SO- 악마 그만해'11

@Giles 제안에 따라 수정find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" | wc -l; done
xenoterracide

2
나는 sort -n -r -k2많은 디렉토리를 위해 이것의 끝에 추가 하고있다. 그래서 나는 가장 많이 사용되는 곳을 알기 위해
xenoterracide

네 번째 부분 : find "$ dir"은 "$ dir"에있는 디렉토리 이름 내의 모든 파일 목록을 만듭니다. -type f파일을 목록으로 만들기 위해 추가 하는 것을 잊었습니다 :find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Krzysztof Boduch

@ krzysiek-boduch 감사합니다! 나는 대답을 업데이트했다.
Shawn J. Goff

15

시도해보십시오 find . -type f | wc -l. 현재 디렉토리의 모든 파일과 하위 디렉토리의 모든 파일을 계산합니다. 모든 디렉토리는 파일로 계산되지 않으며 일반 파일 만 계산됩니다.


13

다음은 유용한 목록 명령어 모음입니다 (이전 사용자 코드를 기반으로 다시 해시 됨).

파일 개수가 포함 된 폴더 나열 :

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); printf "%4d : %s\n" $n "$dir"; done

파일 수가 0이 아닌 폴더를 나열하십시오.

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

하위 폴더 수를 가진 폴더 나열 :

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; printf "%4d : %s\n" $n "$dir"; done

하위 폴더 수가 0이 아닌 폴더를 나열합니다.

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

빈 폴더 나열 :

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -eq 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

내용 개수가 포함 된 비어 있지 않은 폴더를 나열합니다.

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

그리고 btw .. 항목 개수별로 정렬 된 목록 명령 중 하나를 출력하려면 명령을 정렬로 파이프하십시오. "a-list-command"| sort -n
DolphinDream

12

시험:

find /path/to/start/at -type f -print | wc -l

시작점으로 또는 디렉토리의 서브 디렉토리를 통해서만 재귀를 원하는 경우 (그리고 해당 최상위 디렉토리의 파일을 건너 뛰십시오)

find `find /path/to/start/at -mindepth 1 -maxdepth 1 -type d -print` -type f -print | wc -l

무언가 +1 | wc -l ... 단어 수는 정말 멋진 도구입니다
Johan

예, 그러나 이것은 1 디렉토리 만합니다 .... 디렉토리의 모든 디렉토리에 대한 수를 얻고 싶습니다. 매번마다 별도로 실행하고 싶지 않습니다 ... 물론 루프를 사용할 수 있다고 가정합니다 ...하지만 게으르다.
xenoterracide

find기본적으로 모든 하위 디렉토리를 통해 재귀 적으로 작동합니다. 여러 위치에서 작동하게하려면 find및 사이에 모두 지정할 수 있습니다 -type.
Didier Trosset

그 두 번째 것은 확실히 작동하지 않습니다 .... / home에서 시도했습니다. 알았습니다 698035 . 약 6 자리 숫자를 볼 수 있습니다.
xenoterracide

그것은 나를 위해 작동합니다-당신은 아래에 6 개의 파일 만 가지고 /home있습니까? 나는 당신이 100 % 확신하지 않을 것이다.
Cry Havok

4

다음 솔루션은 현재 디렉토리에서 시작하는 실제 사용 된 inode 수를 계산합니다.

find . -print0 | xargs -0 -n 1 ls -id | cut -d' ' -f1 | sort -u | wc -l

동일한 서브 세트의 파일 수를 얻으려면 다음을 사용하십시오.

find . | wc -l

현재 디렉토리의 파일을 고려하지 않고 하위 디렉토리 만 탐색하는 솔루션의 경우 다른 답변을 참조 할 수 있습니다.


1
하드 링크를 고려하는 것이 좋습니다. GNU find를 가정하면 다음과 같은 많은 단계가 필요하지 않습니다 find -printf '%i\n' | sort -u | wc -l. 이식성을 원한다면 find . -exec ls -id {} + | cut …대신에 필요 합니다.
Gilles 'SO- 악마 그만해'11

2

OS X 10.6은에 대한 경로를 지정하지 않기 때문에 허용 된 답변의 명령에서 질식합니다 find. 대신 다음을 사용하십시오.

find . -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

2

나는 파티에 늦었다는 것을 알고 있지만,이 순수한 bash(또는 더블 스타 글롭을 허용하는 다른 쉘) 솔루션은 어떤 상황에서는 훨씬 빠를 수 있다고 생각합니다.

shopt -s globstar    # to enable ** glob in bash
for dir in */; do a=( "$dir"/**/* ); printf "%s\t%s\n" "$dir:" "${#a[*]}"; done

산출:

d1/:    302
d2/:    24
d3/:    640
...

1

이것을 시도하십시오 :

find -type d -print0 | xargs -0 -I {} sh -c 'printf "%s\t%s\n" "$(find "{}" -maxdepth 1 -type f | wc -l)" "{}"'

파일 이름에 줄 바꿈이 포함되어 있지 않으면 제대로 작동합니다.


너무 재귀 적입니다 ... 나는 그 아래의 모든 것을 합계하는 최상위 레벨 만보 고 싶습니다. 합계 ... 모든 디렉토리를 인쇄합니다.
xenoterracide

@xenoterracide : -maxdepth 1첫 번째 바로 뒤에 추가해보십시오 find. 카운트에 서브 디렉토리 수를 포함 시키려면 -type f끝 부분을 제거하십시오 ( ! -type d디렉토리 이외의 모든 파일이 포함되도록 실제로 어쨌든 있어야 함 ).
Dennis Williamson

1

ncdu설치 한 경우 (일부 정리를 수행 할 때 필수 c항목) "자식 항목 수 표시 토글"을 입력 하면됩니다. 그리고 C"항목별로 정렬"합니다.


1
lol, 이것은 가장 많이 허용되는 답변이어야합니다 :)
x-yuri

0

뒤-노이드

왜 아무도 자신을 포함하지 않았는지 잘 모르겠습니다.

du --inodes
--inodes
      list inode usage information instead of block usage

이것이 OP의 문제를 해결한다고 확신합니다. 거대한 드라이브의 모든 정크 위치를 확인하고 오래된 디스크로 오프로드하는 데 많이 사용하기 시작했습니다.

추가 정보

재귀를 원하지 않는 경우 (다른 상황에서 유용 할 수 있음)

-S, --separate-dirs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.