it-swarm-id.com

Bagaimana cara menghitung semua file secara rekursif melalui direktori

Saya ingin melihat berapa banyak file dalam subdirektori untuk mencari tahu di mana semua penggunaan inode pada sistem. Sepertinya saya akan melakukan ini untuk penggunaan ruang

du -sh /*

yang akan memberi saya ruang yang digunakan dalam direktori dari root, tetapi dalam hal ini saya ingin jumlah file, bukan ukurannya.

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

Berkat Gilles dan xenoterracide untuk perbaikan keamanan/kompatibilitas.

Bagian pertama: find -maxdepth 1 -type d akan mengembalikan daftar semua direktori di direktori kerja saat ini. Ini disalurkan ke ...

Bagian kedua: while read -r dir; do memulai loop sementara - selama pipa yang masuk saat sedang terbuka (yang sampai seluruh daftar direktori dikirim), perintah baca akan menempatkan baris berikutnya ke dalam variabel "dir". Kemudian itu berlanjut ...

Bagian ketiga: printf "%s:\t" "$dir"; akan mencetak string dalam "$ dir" (yang menahan salah satu nama direktori) diikuti oleh tab.

Bagian keempat: find "$dir -f file" membuat daftar semua file di dalam nama direktori yang disimpan dalam "$ dir". Daftar ini dikirim ke ..

Bagian kelima: wc -l; menghitung jumlah baris yang dikirim ke input standarnya.

Bagian terakhir: done cukup mengakhiri loop while.

Jadi kami mendapatkan daftar semua direktori di direktori saat ini. Untuk masing-masing direktori tersebut, kami membuat daftar semua file di dalamnya sehingga kami dapat menghitung semuanya menggunakan wc -l. Hasilnya akan terlihat seperti:

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

Coba find . -type f | wc -l, ini akan menghitung semua file dalam direktori saat ini serta semua file dalam subdirektori. Perhatikan bahwa semua direktori tidak akan dihitung sebagai file, hanya file biasa yang melakukannya.

17
herohuyongtao

Berikut adalah kompilasi dari beberapa perintah daftar yang berguna (di-hash ulang berdasarkan kode pengguna sebelumnya):

Daftar folder dengan jumlah file:

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

Daftar folder dengan jumlah file bukan nol:

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

Daftar folder dengan jumlah sub-folder:

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

Daftar folder dengan jumlah sub-folder bukan nol:

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

Daftar folder kosong:

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

Daftar folder yang tidak kosong dengan jumlah konten:

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

Mencoba:

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

sebagai titik awal, atau jika Anda benar-benar hanya ingin mengulang melalui subdirektori direktori (dan lewati file di direktori tingkat atas)

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

Solusi berikut menghitung jumlah sebenarnya dari inode yang digunakan mulai dari direktori saat ini:

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

Untuk mendapatkan jumlah file dari subset yang sama, gunakan:

find . | wc -l

Untuk solusi yang menjelajahi hanya subdirektori, tanpa memperhitungkan file akun di direktori saat ini, Anda dapat merujuk ke jawaban lain.

4
mouviciel

OS X 10.6 mencekik perintah dalam jawaban yang diterima, karena itu tidak menentukan path untuk find. Alih-alih gunakan:

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

Saya tahu saya terlambat ke pesta, tetapi saya yakin solusi murni bash ini (atau Shell lain yang menerima gumpalan bintang ganda) bisa jauh lebih cepat dalam beberapa situasi:

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

keluaran:

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

Cobalah ini:

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

Seharusnya berfungsi dengan baik kecuali nama file menyertakan baris baru.

du --inode

Saya tidak yakin mengapa tidak ada orang (termasuk saya) yang menyadari:

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

Saya cukup yakin ini memecahkan masalah OP. Saya sudah mulai banyak menggunakannya untuk mencari tahu di mana semua sampah di drive saya yang besar (dan menurunkannya ke disk yang lebih tua).

Info lebih lanjut

Jika Anda TIDAK ingin berulang (yang dapat berguna dalam situasi lain), tambahkan

-S, --separate-dirs
1
Sridhar Sarnobat

Jika Anda telah menginstal ncdu (harus dimiliki saat Anda ingin melakukan pembersihan), cukup ketik c ke "Mengalihkan tampilan jumlah item anak". Dan C ke "Urutkan berdasarkan item".

1
Demi-Lune