du yang menghitung jumlah file / direktori daripada ukuran

13

Saya mencoba untuk membersihkan hard drive yang memiliki semua jenis sampah yang terakumulasi selama bertahun-tahun. dutelah membantu mengurangi penggunaan disk, tetapi semuanya masih secara tidak sengaja bukan karena ukuran total, tetapi karena banyaknya file dan direktori secara total.

Apakah ada cara saya bisa melakukan sesuatu seperti dutetapi tidak menghitung ukuran file, melainkan jumlah file dan direktori? Sebagai contoh: file adalah 1, dan direktori adalah jumlah file / direktori rekursif di dalamnya +1.

Sunting: Saya seharusnya lebih jelas. Saya ingin tidak hanya mengetahui jumlah total file / direktori /, tetapi juga di /home, /usrdll, dan di subdirektori mereka, secara rekursif, seperti duhalnya untuk ukuran.

Jesse
sumber
2
Pikirkan Anda mungkin mencari sesuatu seperti versi jawaban yang sedikit dimodifikasi di sini superuser.com/questions/198817/…
James

Jawaban:

11

Saya merasa du --inodesbermanfaat, tetapi saya tidak yakin versi mana yang dudibutuhkan. Di Ubuntu 17.10, yang berikut ini berfungsi:

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

Gabungkan dengan | sort -nruntuk mengurutkan menurun berdasarkan jumlah inode yang mengandung.

krlmlr
sumber
1
Ini jauh lebih mirip dengan apa yang saya inginkan daripada jawaban yang diterima.
Sridhar Sarnobat
8

Sepertinya cara termudah find /path/to/search -ls | wc -l

Temukan digunakan untuk berjalan melalui semua file dan folder.
-lsuntuk daftar (cetak) semua nama. Ini adalah default dan jika Anda membiarkannya, itu akan tetap berfungsi hampir semua sistem. (Hampir, karena beberapa mungkin memiliki default yang berbeda). Ini adalah kebiasaan yang baik untuk menggunakan ini secara eksplisit.

Jika Anda hanya menggunakan find /path/to/search -lsbagian itu akan mencetak semua file dan direktori ke layar Anda.


wcadalah jumlah kata. yang -lpilihan mengatakan itu untuk menghitung jumlah baris.

Anda dapat menggunakannya dalam beberapa cara, misalnya

  • wc testfile
  • kucing testfile | toilet

Opsi pertama memungkinkan kita membuka file dan menghitung jumlah baris, kata, dan karakter dalam file itu. Opsi kedua melakukan hal yang sama tetapi tanpa nama file itu dibaca dari stdin.


Anda dapat menggabungkan perintah dengan pipa |. Output dari perintah pertama akan disalurkan ke input dari perintah kedua. Dengan demikian find /path/to/search -ls | wc -lgunakan find untuk membuat daftar semua file dan direktori dan mengumpankan hasilnya ke wc. Wc kemudian menghitung jumlah garis.

(Alternatif lain adalah `ls | wc ', tetapi menemukan jauh lebih fleksibel dan alat yang baik untuk belajar.)


[Edit setelah komentar]

Mungkin berguna untuk menggabungkan find dan exec.

Misalnya find / -type d ! \( -path proc -o -path dev -o -path .snap \) -maxdepth 1 -exec echo starting a find to count to files in in {} \;akan mencantumkan semua direktori di /, batalkan sebagian yang tidak ingin Anda cari. Kami dapat memicu perintah sebelumnya pada masing-masing, menghasilkan sejumlah file per folder di /.

Namun:

  1. Ini menggunakan ekstensi khusus GNU -maxdepth.
    Ini akan bekerja di Linux, tetapi tidak pada sembarang unix-a-sama.
  2. Saya menduga Anda mungkin benar-benar menginginkan sejumlah file untuk setiap subdir.
Hennes
sumber
Maaf, bukan hanya satu level, tetapi untuk semua level (itulah yang saya maksudkan dengan "secara rekursif" dalam hasil edit saya).
Jesse
Alih-alih eksekutif gema Anda memicu menemukan | wc untuk setiap dir. Saya tahu itu mungkin, tetapi saya tidak dapat menemukan caranya hari ini. Saya kira saya terus melakukan kesalahan yang sama. * Pergi untuk menyeduh kopi *.
Hennes
4

Script PHP berikut ini membantu.

#!/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']);
}

Masukkan itu dalam file (katakanlah, " treesize"), chmod +xdan jalankan dengan ./treesize . | sort -rn | less.

Jesse
sumber
Mengapa ini jawaban yang diterima ?! Anda menganggap php ada di mesin, yang tidak selalu terjadi. Script tidak didokumentasikan dan spesifik. Meskipun tidak apa-apa untuk menjawab pertanyaan Anda sendiri di SE, jawaban ini bahkan tidak memberikan Jawaban untuk pertanyaan Anda sendiri ; atau Anda tidak mengajukan pertanyaan yang ada dalam benak Anda ketika masalah terjadi ... Sayangnya saya tidak bisa membatalkannya, saya harus beberapa poin ... masih, jawaban yang buruk!
user1810087
Saya tidak dapat menulis skrip dalam bahasa apa pun tanpa menganggap penerjemah untuk bahasa tersebut diinstal. Script mencetak jumlah total file dan direktori di bawah setiap direktori secara rekursif. Jadi duyang hanya menghitung bukan menjumlahkan ukuran, yang persis apa yang ditanyakan pertanyaan aslinya.
Jesse
2

ncdu bagus untuk ini!

Dari halaman manual, Anda dapat menampilkan jumlah per direktori dan memesan berdasarkan jumlah juga:

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

Sebagai contoh:

keluaran ncdu

pencari kerja
sumber
1

Memanfaatkan fakta bahwa dir dan file dipisahkan oleh /. Script ini memang memenuhi kriteria Anda, tetapi berfungsi untuk menginspirasi solusi lengkap. Anda juga harus mempertimbangkan mengindeks file Anda dengan loc.

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
Ярослав Рахматуллин
sumber
2
Mengapa saya memiliki .fluxbox di /? : D
Ярослав Рахматуллин
1

Inilah solusi yang menggunakan bash, terinspirasi oleh posting dari Unix & Linux .

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

Jika ada beberapa folder yang Anda tidak ingin melihat detailnya, seperti .git, Anda dapat mengecualikannya dari daftar grep.

find . -type d |grep -v "./.git/.*" | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Don Kirkby
sumber