サイズではなくファイル/ディレクトリの数をカウントするdu


13

私は、長年にわたってあらゆる種類のがらくたが蓄積されているハードドライブをクリーンアップしようとしています。duディスクの使用量を削減するのに役立ちましたが、全体のサイズが原因ではなく、ファイルとディレクトリの合計数が膨大であるため、全体としては依然として扱いにくいです。

duファイルサイズではなく、ファイルとディレクトリの数をカウントするような方法はありますか?たとえば、ファイルは1、ディレクトリはその中のファイル/ディレクトリの再帰的な数+ 1です。

編集:私はもっ​​と明確であったはずです。サイズの場合と/同様に/home、内のファイル/ディレクトリの総数だけでなく/usr、およびそのサブディレクトリ内の再帰的に合計数を知りたいのですがdu


2
あなたはここで答えを少し変更したバージョンのようなものを探しているかもしれないと思うsuperuser.com/questions/198817/...
ジェームズ

回答:


11

du --inodes便利だと思いましたが、どのバージョンがdu必要か分かりません。Ubuntu 17.10では、以下が機能します。

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

と組み合わせると| sort -nr、含まれるiノードの数で降順​​でソートされます。


1
これは、受け入れられた答えよりも、私が望むものに非常によく似ています。
Sridhar Sarnobat

8

最も簡単な方法は find /path/to/search -ls | wc -l

Findは、すべてのファイルとフォルダーをウォークスルーするために使用されます。
-lsすべての名前をリスト(印刷)します。これはデフォルトであり、省略してもほとんどすべてのシステムで同じように機能します。(ほとんどの場合、デフォルトが異なる場合があるため)。これを明示的に使用するのは良い習慣です。

find /path/to/search -lsパーツを使用するだけで、すべてのファイルとディレクトリが画面に出力されます。


wc単語数です。-lオプションでは、行数をカウントすることを伝えます。

いくつかの方法で使用できます。

  • トイレテストファイル
  • 猫テストファイル| トイレ

最初のオプションは、wcにファイルを開いて、そのファイル内の行、単語、文字の数をカウントさせます。2番目のオプションは同じことを行いますが、ファイル名なしでstdinから読み取ります。


コマンドをパイプで組み合わせることができます|。最初のコマンドの出力は、2番目のコマンドの入力にパイプされます。したがってfind /path/to/search -ls | wc -l、findを使用してすべてのファイルとディレクトリをリストし、出力をwcにフィードします。その後、WCは行数をカウントします。

(他の代替手段は `ls | wc 'でしたが、findははるかに柔軟であり、学習に適したツールです。)


[コメント後に編集]

findと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で動作しますが、UNIXだけでは動作しません。
  2. 私はあなたが実際にすべてのサブディレクトリにいくつかのfoファイルを必要としているのではないかと思います。

申し訳ありませんが、深さは1レベルだけでなく、すべてのレベルに適用されます(これが編集で「再帰的に」という意味でした)。
ジェシー

execエコーの代わりに、検索をトリガーします。各ディレクトリのwc。私はそれが可能であることを知っていますが、今日はその方法を発見できないようです。どういうわけか私は同じ間違いを犯し続けていると思います。*コーヒーを淹れるために行きます*。
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にあなた自身の質問に答えるためにOKですが、この答えはさえに答えられない独自の質問を。または、問題が発生したときに念頭に置いていた質問をしなかった...残念ながら、私はそれを否定することはできません。
user1810087

私は、その言語のインタープリターがインストールされていると想定しない限り、どの言語でスクリプトを書くことはできません。スクリプトは、各ディレクトリの下にあるファイルとディレクトリの総数を再帰的に出力します。つまり、duサイズを合計するのではなく、単純にカウントします。これは、元の質問
ジェシー

2

ncduはこれに最適です!

manページから、ディレクトリごとのカウントを表示し、カウント順に並べることもできます。

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

例えば:

NCDU出力


1

ディレクトリとファイルがで区切られているという事実を利用します/。このスクリプトはあなたの基準を満たしていますが、完全なソリューションを刺激するのに役立ちます。また、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

UnixとLinuxから投稿に触発された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.