it-swarm-ko.tech

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

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

du -sh /*

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

52
xenoterracide
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; do는 while 루프를 시작합니다. while으로 들어오는 파이프가 열려 있으면 (전체 디렉토리 목록이 전송 될 때까지) read 명령은 다음 행을 변수 "dir"에 배치합니다. 그런 다음 계속됩니다 ...

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

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

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

마지막 부분 : done은 단순히 while 루프를 종료합니다.

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

./dir1: 234
./dir2: 11
./dir3: 2199
...
67
Shawn J. Goff

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

17
herohuyongtao

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

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

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

이 아닌 하위 폴더 수를 가진 폴더 나열 :

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
13
DolphinDream

시험:

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
12
Cry Havok

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

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

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

find . | wc -l

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

4
mouviciel

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
abeboparebop

나는 파티에 늦었다는 것을 알고 있지만,이 순수한 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
...
2
jimmij

이것을 시도하십시오 :

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

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

뒤-노이드

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

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

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

추가 정보

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

-S, --separate-dirs
1
Sridhar Sarnobat

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

1
Demi-Lune