Bagaimana saya dapat menggunakan find
untuk menghasilkan daftar direktori yang berisi jumlah file terbanyak. Saya ingin daftar dari tertinggi ke terendah. Saya hanya ingin daftar masuk 1 level, dan saya biasanya menjalankan perintah ini dari atas sistem file saya, yaitu /
.
21
Jawaban:
Menggunakan alat GNU:
Ini menggunakan dua
find
perintah. Direktori menemukan pertama dan pipa mereka kewhile
loop menjalankan pencarian berikutnya untuk setiap direktori. Yang kedua mencantumkan semua file anak / direktori di tingkat pertama sambilgrep
menghitungnya. Thegrep
memungkinkan-print0
untuk digunakan dengan menemukan kedua sejakwc
tidak memiliki-z
setara. Ini menghentikan nama file dengan baris baru yang dihitung dua kali (meskipun menggunakanwc
dan tidak-print0
akan membuat banyak perbedaan).Hasil yang kedua
find
ditempatkan dalam argumenecho
sehingga dan nama direktori dapat dengan mudah ditempatkan pada baris yang sama ($(..)
konstruk secara otomatis memotong baris baru di akhirgrep
). Baris kemudian diurutkan berdasarkan nomor dan 50 angka terbesar ditunjukkan denganhead
.Perhatikan bahwa ini juga akan mencakup direktori tingkat atas dari titik pemasangan. Cara sederhana untuk menyiasatinya adalah menggunakan bind mount dan kemudian gunakan direktori mount. Untuk melakukan ini:
Solusi yang lebih portabel menggunakan contoh shell yang berbeda untuk setiap direktori (juga dijawab di sini ):
Output sampel:
sumber
UPDATE: Saya melakukan semua itu di bawah ini, yang keren, tapi saya menemukan cara yang lebih baik untuk menyortir direktori dengan menggunakan inode:
Dan jika Anda ingin tetap di sistem file yang sama Anda lakukan:
Berikut beberapa contoh output:
SEKARANG DENGAN LS:
Beberapa orang mengatakan mereka tidak memiliki coreutil terbaru dan opsi --inodes tidak tersedia untuk mereka. Jadi, ini dia:
Ini memberikan saya hasil yang hampir sama dengan
du
perintah:DU:
LS:
Saya pikir
include
masalahnya tergantung pada direktori mana program terlihat pada awalnya - karena mereka file yang sama dan di-hardlink. Agak suka hal di atas. Saya bisa saja salah tentang itu - dan saya menerima koreksi ...Metode yang mendasari ini adalah bahwa saya mengganti setiap
ls
nama file dengan nama direktori yang berisi dised.
Mengikuti dari itu ... Yah, saya sendiri agak kabur. Saya cukup yakin itu secara akurat menghitung file, seperti yang Anda lihat di sini:DU DEMO
Buat direktori pengujian:
Beberapa direktori anak-anak:
Buat beberapa file:
Beberapa hardlink:
Lihatlah hardlinks:
Mereka dihitung sendiri, tetapi naik satu direktori ...
Kemudian saya menjalankan skrip saya dari bawah dan:
Dan Graeme:
Jadi saya pikir ini menunjukkan bahwa satu-satunya cara untuk menghitung inode adalah dengan inode. Dan karena menghitung file berarti menghitung inode, Anda tidak dapat menghitung dua kali inode - untuk menghitung file secara akurat inode tidak dapat dihitung lebih dari sekali.
TUA:
Saya menemukan ini lebih cepat, dan ini portabel:
Tidak harus
-exec
untuk setiap direktori - hanya menggunakan proses satush
el dan satufind
. Saya harusset -- $glob
tetap benar untuk memasukkan.hidden
file dan yang lainnya, tetapi sangat dekat dan sangat cepat. Anda akancd
masuk ke direktori root apa saja yang harus Anda periksa dan pergilah.Berikut ini contoh dari hasil keluaran saya
/usr
:Saya juga menggunakan
sed
di bagian bawah sana untuk memotongnya ke 50 hasil teratas.head
akan lebih cepat, tentu saja, tetapi saya juga memotong setiap baris jika perlu:Memang kasar, memang, tapi itu hanya pemikiran. Perangkat kasar lain yang saya gunakan adalah dumping
2>stderr
untuk keduanyafind
dancd
masuk2>/dev/null
. Itu lebih bersih daripada melihat kesalahan izin untuk direktori yang tidak dapat saya baca tanpa akses root - mungkin saya harus menentukannya untukfind
. Ya, ini masih dalam proses.Ok, jadi saya memperbaiki gumpalan shell seperti ini:
Saya sebenarnya akan mengajukan pertanyaan tentang bagaimana hal itu bisa dilakukan, tetapi ketika saya mengetikkan judul pertanyaan, situs itu mengarahkan saya ke sebuah pertanyaan terkait yang disarankan di mana, lihatlah, Stephane sudah menimbang . Jadi itu nyaman. Ternyata
[^.],
sementara didukung dengan baik, tidak portabel dan Anda harus menggunakan!bang.
saya menemukan bahwa dalam komentar Stephane di sana.Bagaimanapun, menarik file tersembunyi saja tidak cukup, jelas. Jadi saya harus
set
dua kali untuk menghindari mencari posisi untuk literal$glob
. Namun, tampaknya tidak mempengaruhi kinerja sama sekali, dan itu andal menambahkan setiap file dalam direktori.sumber
ls -i
dan ... Saya kira ... mungkingrep
... mungkin - yah, Anda menggunakan-xdev,
yang merupakan awal ...uniq
dansort
?du
yang Anda jalankan? Sayadu
tidak punya--inodes
pilihan.Mengapa tidak menggunakan sesuatu seperti KDirStat Meskipun pada awalnya ditulis untuk KDE tetapi berfungsi baik dengan GNOME juga Ini memberi Anda tampilan terbaik dari jumlah file / dir dan penggunaan masing-masing dalam GUI
sumber