Bagaimana cara menampilkan ukuran file "yang dapat dibaca manusia" dalam hasil pencarian?

11

Saya mencoba menemukan semua file besar di server Centos saya. Untuk melakukan itu saya menggunakan:

find / -maxdepth 10 -size +100000 -ls

Aku mencoba mengubah -lske -lshtetapi tidak diperbolehkan.

Bagaimana saya bisa menampilkan hasil ini dengan ukuran yang bisa dibaca manusia (menggunakan sufiks k, M, ...)?

blarg
sumber
Apa definisi Anda untuk dibaca manusia? Bagi saya itu cukup mudah dibaca oleh manusia.
manatwork
Anda harus mencoba fileutilitas find.
Ramesh
@manatwork kb, mb, gb
blarg

Jawaban:

10

findtidak memiliki opsi canggih seperti ls. Jika ingin ls -h, Anda perlu menelepon ls.

find / -maxdepth 10 -size +100000 -exec ls -lh {} +

Saya merekomendasikan -xdevopsi untuk menghindari berulang ke sistem file lain, yang akan sia-sia jika Anda khawatir tentang ruang disk.

find / -xdev -maxdepth 10 -size +100000 -exec ls -lh {} +

Jika Anda menggunakan zsh sebagai shell, maka alih-alih menggunakan find, Anda dapat menggunakan kualifikasi glob. Membatasi ukuran file sederhana: Ldiikuti dengan ukuran; ukuran dapat memiliki unit opsional sebelum nomor tersebut. Jika Anda tidak peduli dengan kedalaman maksimum, Anda dapat menggunakannya **/untuk kembali ke subdirektori. Jika Anda peduli dengan kedalaman maksimum, itu lebih rumit karena pola zsh glob tidak memiliki cara untuk mengekspresikan "paling banyak n kejadian". Untuk menghindari rekursi lintas perangkat, gunakan dkualifikasi glob; Anda perlu menemukan nomor perangkat, yang dapat Anda tampilkan dengan statperintah di Linux ( stat -c %d /hanya menampilkan nomor) atau dengan statbuiltin zsh sendiri (jalankan zmodload zsh/statuntuk memuatnya).

ls -lh /**/*(L+M99d$(stat -c %d /))
Gilles 'SANGAT berhenti menjadi jahat'
sumber
4

Perintah yang Anda coba dapat dibaca oleh saya. Namun, Anda dapat menggunakan utilitas file dengan find seperti di bawah ini.

find / -maxdepth 10 -size +100000 -exec sh -c 'file -b {} | grep text &>/dev/null' \; -print

Cara lain untuk melakukan ini adalah menggunakan perintah di bawah ini.

du -BM / | sort -nr

Perintah di atas akan memberi Anda file dalam ukuran file yang diurutkan.

Jika Anda menggunakan coreutils> 7.5 , Anda dapat mengeluarkan perintah di bawah ini untuk membuat daftar file berdasarkan ukuran.

du -ah / | grep -v "/$" | sort -h

Di mesin saya, saya tidak memiliki sort -hopsi yang tersedia.

Seperti yang telah Anda sebutkan dalam komentar, format yang dapat dibaca manusia adalah file harus berukuran kb , mb atau gb . Saya akan pergi dengan perintah kedua yang telah saya posting sebagai jawabannya. Output yang saya dapatkan ketika saya menggunakannya di sistem saya adalah,

du -BM /home/ramesh/chk1/ | sort -nr

50M     /home/ramesh/chk1/
21M     /home/ramesh/chk1/Hierarchical_Clustering_Working
3M      /home/ramesh/chk1/checking_files
1M      /home/ramesh/chk1/checking/checking2
1M      /home/ramesh/chk1/checking/checking1
1M      /home/ramesh/chk1/checking/asdf
1M      /home/ramesh/chk1/checking
Ramesh
sumber
Apakah ada cara untuk menetapkan batas bawah pada perintah kedua Anda? File terbesar muncul di bagian atas dan dengan cepat menghilang dari bagian atas shell. EDIT - Saya melihat Anda hanya perlu menghapus r
blarg
Anda dapat mengarahkan output ke file dengan menambahkan > outputperintah. Kemudian, Anda dapat membuka file dan melihat output sesuai keinginan :)
Ramesh
Saya melihat ini menampilkan folder juga, sedangkan saya hanya mencari file
blarg
du -a --max-depth=10 / | sort -rnadalah kedekatan yang bisa kutemukan. Namun, dalam hal ini, itu tidak akan menampilkan ukuran dalam KB, MB atau GB.
Ramesh
1

Saya pikir apa yang Anda cari lebih seperti yang berikut ini.

find / -maxdepth 10 -size +100000 -exec ls -lah {} + 

The -execmemungkinkan Anda untuk menjalankan perintah dan {}digantikan dengan hasil temuan. Terakhir +adalah untuk memberitahukan bahwa ini adalah akhir dari perintah dan diperlukan.

Tim Hughes
sumber
2
Sebenarnya sama sekali tidak perlu mengutip di {}sini. Kutipan tunggal dalam perintah adalah untuk shell tetapi shell tidak akan pernah melihat ls -lah <args...>perintah sama sekali - ia melihat {}, yang tidak perlu dikutip. Itu adalah findyang melihat ls -lah {}dan findyang memperluas {}, dan seperti tersirat dengan nama -execopsi, findmenggunakan exec*panggilan sistem pada argumen secara langsung, sehingga tidak akan ada masalah dengan spasi karena findtidak akan melakukan pemisahan kata pada nama file Anda.
jw013
1
The -apilihan untuk lstidak diperlukan karena argumen diharapkan menjadi file dan tidak direktori. GNU menemukan kegunaan ls -dilsuntuk -lsopsi, jadi untuk mereplikasi yang paling dekat itu akan ls -dilsh.
jw013
man find memberikan yang berikut ini untuk contoh pertama menggunakan -exec : find . -type f -exec file '{}' \; Menjalankan file pada setiap file di atau di bawah direktori saat ini. Perhatikan bahwa kurung kurawal ditutup dengan tanda kutip tunggal untuk melindunginya dari interpretasi sebagai tanda baca skrip shell. Tanda titik koma juga dilindungi oleh penggunaan backslash, meskipun tanda kutip tunggal bisa digunakan dalam kasus itu juga.
Tim Hughes
1
Halaman manual hanya menganjurkan beberapa peringatan yang tidak perlu. Tidak akan sakit, tetapi saya tidak mengetahui adanya shell yang perlu {}dikutip.
jw013