크기보다는 파일 / 디렉토리 수를 계산하는 du


13

수년에 걸쳐 쌓여있는 모든 종류의 쓰레기가있는 하드 드라이브를 청소하려고합니다. du디스크 사용량을 줄이는 데 도움이되었지만 전체 크기가 아니라 전체 파일과 디렉토리의 수가 많기 때문에 모든 것이 여전히 엉망입니다.

du파일 크기를 세지 않고 파일과 디렉토리 수를 세는 것과 같은 것을 할 수있는 방법이 있습니까? 예를 들어, 파일은 1이고 디렉토리는 그 안에있는 파일 / 디렉토리의 재귀 수 + 1입니다.

편집 : 나는 더 분명했다. 나는에있는 파일 / 디렉토리의 총 수를 알뿐만 아니라 싶습니다 /뿐만 아니라에서 /home, /usr등, 그 하위 디렉토리에 재귀처럼이 du크기 않습니다.


답변:


11

나는 발견했다 du --inodes유용하지만 버전 확실하지 않다 du가 필요합니다. 우분투 17.10에서는 다음이 작동합니다.

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

와 결합 | sort -nr포함하는 아이 노드의 수에 의해 정렬 내림차순으로.


1
이것은 내가 받아 들인 대답보다 내가 원하는 것과 훨씬 비슷해 보입니다.
Sridhar Sarnobat 1

8

가장 쉬운 방법은 find /path/to/search -ls | wc -l

찾기는 모든 파일과 폴더를 걸을 때 사용됩니다.
-ls모든 이름을 나열 (인쇄)합니다. 이것은 기본값이며, 그대로두면 거의 모든 시스템에서 동일하게 작동합니다. (거의 일부는 기본값이 다를 수 있으므로) 이것을 명시 적으로 사용하는 것은 좋은 습관입니다.

find /path/to/search -ls파트를 사용하면 모든 파일과 디렉토리를 화면에 인쇄합니다.


wc단어 개수입니다. 이 -l옵션은 줄 수를 계산하도록 지시합니다.

여러 가지 방법으로 사용할 수 있습니다. 예 :

  • 화장실 테스트 파일
  • 고양이 테스트 파일 | 화장실

첫 번째 옵션을 사용하면 wc는 파일을 열고 해당 파일의 줄, 단어 및 문자 수를 계산할 수 있습니다. 두 번째 옵션은 파일 이름없이 동일하지만 stdin에서 읽습니다.


파이프와 명령을 결합 할 수 있습니다 |. 첫 번째 명령의 출력은 두 번째 명령의 입력으로 파이프됩니다. 따라서 find /path/to/search -ls | wc -lfind를 사용하여 모든 파일과 디렉토리를 나열하고 출력을 wc에 공급합니다. 그런 다음 Wc는 줄 수를 계산합니다.

(또 다른 대안은`ls | wc '였지만 찾기는 훨씬 더 유연하고 배우기 좋은 도구입니다.)


[댓글 후 편집]

찾기와 exec를 결합하는 것이 유용 할 수 있습니다.

예를 들어 find / -type d ! \( -path proc -o -path dev -o -path .snap \) -maxdepth 1 -exec echo starting a find to count to files in in {} \;/에있는 모든 디렉토리를 나열하고 검색하지 않으려는 디렉토리를 표시하십시오. 각각에 대해 이전 명령을 트리거하여 /의 폴더 당 파일 수를 산출 할 수 있습니다.

하나:

  1. 이것은 GNU 특정 확장자 인 -maxdepth를 사용합니다.
    Linux에서는 작동하지만 유닉스와는 달리 작동하지 않습니다.
  2. 실제로 각 하위 디렉토리마다 여러 개의 fo 파일을 원할 것으로 생각됩니다.

미안하지만, 한 수준 깊숙이 아니라 모든 수준에 대해 (내 편집에서 "재귀 적으로"의 의미입니다).
Jesse

exec echo 대신 find | 각 디렉토리에 대한 화장실. 나는 그것이 가능하다는 것을 알고 있지만, 오늘 방법을 발견하지 못하는 것 같습니다. 어쨌든 같은 실수를 계속하는 것 같아요. * 커피를 추출합니다 *.
Hennes

4

다음 PHP 스크립트가 트릭을 수행합니다.

#!/usr/bin/php
<?php 

function do_scan($dir, $dev) {
  $total = 1;

  if (\filetype($dir) === 'dir' && \lstat($dir)['dev'] == $dev) {
    foreach (\scandir($dir) as $file) {
      if ($file !== '.' && $file !== '..') {
        $total += do_scan($dir . \DIRECTORY_SEPARATOR . $file, $dev);
      }
    }

    print "$total\t$dir\n";
  }

  return $total;
};

foreach (\array_slice($argv, 1) as $arg) {
  do_scan($arg, \lstat($arg)['dev']);
}

파일 (예 : " treesize")에 chmod +x넣고로 실행하십시오 ./treesize . | sort -rn | less.


이것이 왜 대답입니까?! PHP가 컴퓨터에 있다고 가정하고 있지만 항상 그런 것은 아닙니다. 스크립트는 문서화되어 있지 않으며 구체적이지 않습니다. 이 SE에 대한 자신의 질문에 대한 답을 확인하지만,이 답변도에 대한 답변을 제공하지 않습니다 자신의 질문을 ; 또는 당신은 문제가 발생했을 때 당신이 생각했던 질문을하지 않았다 ... 불행히도 나는 그것을 내려 놓을 수 없다.
user1810087

해당 언어에 대한 인터프리터가 설치되어 있다고 가정하지 않으면 어떤 언어 로든 스크립트를 작성할 수 없습니다 . 스크립트는 각 디렉토리 아래에 재귀 적으로 총 파일 및 디렉토리 수를 인쇄합니다. 그래서 du그것은 합산 크기 대신 단순히 계산됩니다 . 원래 질문과 정확히 일치합니다.
Jesse

2

ncdu 는 이것에 좋습니다!

매뉴얼 페이지에서 디렉토리 당 개수와 개수별로 순서를 표시 할 수 있습니다.

[...]
KEYS
       C   Order by number of items (press again for descending order)
[...]
       c   Toggle display of child item counts.

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

ncdu 출력


1

dirs와 파일이로 구분된다는 사실을 이용하십시오 /. 이 스크립트는 사용자의 기준에 부합하지만 완전한 솔루션을 제공합니다. 또한 locate를 사용하여 파일을 색인화하는 것을 고려해야합니다.

geee: /R/tb/tmp
$ find  2>/dev/null | awk -F/ -f filez  | sort -n
files:  57
3       imagemagick
7       portage
10      colemak-1.0
25      minpro.com
42      monolith
80      QuadTree
117     themh
139     skyrim.stings
185     security-howto
292     ~t
329     skyrim
545     HISTORY
705     minpro.com-original
1499    transmission-2.77
23539   ugent-settings

>

$ cat filez
{
a[$2]++;     # $1= folder,  $2 = everything inside folder.
}

END {
        for (i in a) {
                if (a[i]==1) {files++;}
                else { printf "%d\t%s\n", a[i], i; }
        }
        print "files:\t" files
}

>

 $ time locate /  | awk -F/ -f /R/tb/tmp/filez  | sort -n
 files:  13
 2
 2       .fluxbox
 10      M
 11      BIN
 120     bin
 216     sbin
 234     boot
 374     R
 854     dev
 1351    lib
 2018    etc
 9274    media
 30321   opt
 56516   home
 93625   var
 222821  usr
 351367  mnt
 time: Real 0m17.4s  User 0m4.1s  System 0m3.1s

2
왜 /에 .fluxbox가 있습니까? : D
Ярослав Рахматуллин

1

다음 은 유닉스 및 리눅스게시물에서 영감을 얻은 bash를 사용하는 솔루션입니다 .

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

와 같은 세부 정보를보고 싶지 않은 폴더가 .git있는 경우을 사용하여 목록에서 해당 폴더를 제외 할 수 있습니다 grep.

find . -type d |grep -v "./.git/.*" | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.