Menyortir file sesuai ukuran secara rekursif

79

Saya perlu menemukan file terbesar di folder.
Bagaimana cara memindai folder secara rekursif dan mengurutkan isinya berdasarkan ukuran?

Saya sudah mencoba menggunakan ls -R -S, tetapi ini mencantumkan direktori juga.
Saya juga mencoba menggunakan find.

pengguna2179293
sumber
1
Apakah Anda ingin membuat daftar file di setiap subdirektori secara terpisah atau apakah Anda ingin menemukan semua file di semua subdirektori dan mendaftarkannya berdasarkan ukuran terlepas dari subdireks mana mereka berada? Juga, apa yang Anda maksud dengan "direktori" dan "folder"? Anda tampaknya menggunakannya untuk menggambarkan hal-hal yang berbeda.
terdon
Apakah Anda mengatakan bahwa Anda hanya ingin membuat daftar file dalam direktori yang diberikan serta file dalam sub-direktori tanpa hanya menampilkan sub-direktori? Silakan coba dan bersihkan pertanyaan Anda, itu tidak terlalu jelas.
slm
Terkait unix.stackexchange.com/questions/158289/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

92

Anda juga dapat melakukan ini dengan adil du. Agar aman, saya menggunakan versi du:

$ du --version
du (GNU coreutils) 8.5

Pendekatan:

$ du -ah ..DIR.. | grep -v "/$" | sort -rh

Kerusakan pendekatan

Perintah du -ah DIRakan menghasilkan daftar semua file dan direktori dalam direktori yang diberikan DIR. The -hakan menghasilkan ukuran yang dapat dibaca manusia yang saya suka. Jika Anda tidak menginginkannya, jatuhkan saklar itu. Saya menggunakan head -6hanya untuk membatasi jumlah output!

$ du -ah ~/Downloads/ | head -6
4.4M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K    /home/saml/Downloads/kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M    /home/saml/Downloads/kodak_W820_wireless_frame
8.0K    /home/saml/Downloads/bugs.xls
604K    /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf

Cukup mudah untuk mengurutkannya dari yang terkecil hingga yang terbesar:

$ du -ah ~/Downloads/ | sort -h | head -6
0   /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock

Balikkan, terbesar ke terkecil:

$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy

Jangan perlihatkan padaku direktori, hanya file:

$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6 
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run

Jika Anda hanya ingin daftar file terkecil hingga terbesar, tetapi 6 file teratas yang menyinggung Anda dapat membalikkan pengalih sortir, drop ( -r), dan gunakan tail -6sebagai ganti head -6.

$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
1.5G    /home/saml/Downloads/digital_blasphemy
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
2.3G    /home/saml/Downloads/apps_archive
3.8G    /home/saml/Downloads/audible
3.8G    /home/saml/Downloads/audible/audio_books
slm
sumber
14
Bagian grep -v "/$"tampaknya tidak melakukan apa yang Anda harapkan, karena direktori tidak memiliki garis miring ditambahkan. Adakah yang tahu cara mengecualikan direktori dari hasil?
Jan Warchoł
@ JanekWarchol - versi coreutils apa yang Anda gunakan?
slm
Saya menggunakan 8.13. Tetapi bagaimanapun juga, output dalam jawaban Anda tidak memiliki trailing /s baik - misalnya /home/saml/Downloads/audibletampaknya menjadi direktori, tetapi tidak memiliki garis miring. Hanya /home/saml/Downloads/memiliki garis miring, tetapi itu mungkin karena Anda menulisnya dengan garis miring ketika menentukan argumen untuk inisial du.
Jan Warchoł
1
Ini juga menemukan dirs
ekerner
1
Ini tidak mencantumkan hanya file, tetapi juga daftar direktori :(
Roman Gaufman
21

Jika Anda ingin menemukan semua file di direktori saat ini dan sub direktori dan daftar mereka sesuai dengan ukurannya (tanpa mempertimbangkan jalurnya), dan dengan asumsi tidak ada nama file yang mengandung karakter baris baru, dengan GNU find, Anda dapat melakukan ini:

find . -type f -printf "%s\t%p\n" | sort -n

Dari man findpada sistem GNU:

   -printf format
          True; print format  on  the  standard  output,
          interpreting  `\'  escapes and `%' directives.
          Field widths and precisions can  be  specified
          as  with the `printf' C function.  Please note
          that many of the  fields  are  printed  as  %s
          rather  than  %d, and this may mean that flags
          don't work as you  might  expect.   This  also
          means  that  the `-' flag does work (it forces
          fields to be  left-aligned).   Unlike  -print,
          -printf  does  not add a newline at the end of
          the string.  The escapes and directives are:

          %p     File's name.
          %s     File's size in bytes.

Dari man sort:

   -n, --numeric-sort
          compare according to string numerical value
terdon
sumber
Sayangnya, Tidak berfungsi di Mac, menunjukkan: cari: -printf: primer atau operator tidak dikenal
Roman Gaufman
@RomanGaufman ya, itu sebabnya jawabannya menentukan GNU find. Jika Anda menginstal alat GNU pada Mac Anda, itu akan berfungsi di sana juga.
terdon
11

Coba perintah berikut:

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

Itu akan daftar top-20 file terbesar di direktori saat ini secara rekursif.

Catatan: Opsi -huntuk sorttidak tersedia di OSX / BSD, jadi Anda harus menginstal sortdari coreutils(misalnya melalui brew) dan menerapkan jalur bin lokal ke PATH, misalnya

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

Atau gunakan:

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

Untuk penggunaan direktori terbesar du, misalnya:

du -ah . | sort -rh | head -20

atau:

du -a . | sort -rn | head -20
kenorb
sumber
3
Sempurna, ini adalah solusi pertama yang bekerja di Mac dan tidak menampilkan direktori :) - terima kasih!
Roman Gaufman
bagaimana filter hanya menampilkan file dengan jumlah baris> = X? (X = 0 untuk contoh)
Matriks
7

Ini akan menemukan semua file secara rekursif, dan mengurutkannya berdasarkan ukuran. Ini mencetak semua ukuran file dalam kb, dan membulatkannya sehingga Anda dapat melihat 0 KB file, tapi itu cukup dekat untuk saya gunakan, dan bekerja pada OSX.

find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1

Taman Brad
sumber
bekerja di Ubuntu 14.04 juga!
David Lam
Ini daftar direktori, bukan hanya file :(
Roman Gaufman
@RomanGaufman - terima kasih atas umpan baliknya! dari pengujian saya, find . -type fmenemukan file ... ini bekerja secara rekursif, Anda benar, tetapi daftar semua file yang ditemukannya, bukan direktori itu sendiri
Brad Parks
Xargs telah digunakan pada 1980-an. Ini adalah ide yang buruk sejak 1989 ketika execplus telah diperkenalkan oleh David Korn.
schily
5

Dengan zsh, Anda akan menemukan file terbesar (dalam hal ukuran yang tampak seperti kolom ukuran dalam ls -loutput, bukan penggunaan disk) dengan:

ls -ld -- **/*(DOL[1])

Untuk 6 yang terbesar:

ls -ld -- **/*(DOL[1,6])

Untuk mengurutkan mereka berdasarkan ukuran file, Anda dapat menggunakan ls's -Spilihan. Beberapa lsimplementasi juga memiliki -Uopsi untuk lstidak mengurutkan daftar (karena sudah diurutkan berdasarkan ukuran di zshsini).

Stéphane Chazelas
sumber
3

Solusi sederhana untuk Mac / Linux yang melewatkan direktori:

find . -type f -exec du -h {} \; | sort -h
mprcela
sumber
2

Setara di BSDatau OSXadalah

$ du -ah simpl | sort -dr | head -6
hanxue
sumber
0

Ini adalah kebutuhan yang sangat umum untuk berbagai alasan (saya suka menemukan cadangan terbaru dalam direktori), dan merupakan tugas yang sangat sederhana.

Saya akan memberikan solusi Linux yang menggunakan utilitas find, xargs, stat, tail, awk, dan sortir.

Kebanyakan orang telah memberikan beberapa jawaban unik, tetapi saya lebih suka jawaban saya karena itu benar menangani nama file, dan use case dapat dengan mudah diubah (ubah stat, dan urutkan argumen)

Saya juga akan memberikan solusi Python yang seharusnya memungkinkan Anda menggunakan fungsi ini bahkan di Windows

Solusi baris perintah Linux

Secara rekursif mengembalikan seluruh daftar hanya file dari direktori, diurutkan berdasarkan ukuran file

find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n

Sama seperti sebelumnya, tapi kali ini, kembalikan file terbesar.

# Each utility is split on a new line to help 
# visualize the concept of transforming our data in a stream
find . -type f -print0 | 
xargs -0 -I{} stat -c '%s %n' {} | 
sort -n | 
tail -n 1 |
awk '{print $2}'

Pola persis sama, tetapi sekarang pilih file terbaru, bukan terbesar

# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} | 
sort -n | tail -n 1 | awk '{print $2}'

Penjelasan:

  1. find: Secara rekursif menemukan semua file dari direktori saat ini, dan mencetaknya dengan karakter nol
  2. xargs: utilitas untuk mengeksekusi perintah menggunakan argumen yang disediakan dari input standar. Untuk setiap baris output, kami ingin menjalankan utilitas stat pada file itu
  3. stat: Stat adalah perintah serba bisa yang memiliki begitu banyak kasus penggunaan. Saya mencetak dua kolom, kolom pertama adalah ukuran blok (% s), dan kolom kedua adalah nama file (% n)
  4. sortir: Urutkan hasil dengan saklar angka. Karena argumen pertama adalah bilangan bulat, hasil kami akan diurutkan dengan benar
  5. tail: Hanya pilih jalur keluaran terakhir (karena daftar diurutkan, ini adalah file terbesar!)
  6. awk: Pilih kolom kedua, yang berisi nama file, dan merupakan file terbesar di direktori rekursif.

Solusi python

#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
    for filename in filenames:
        realpath = os.path.join(dirpath, filename)
        files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)

Skrip ini membutuhkan waktu agak lama untuk dijelaskan, tetapi pada dasarnya jika Anda menyimpannya sebagai skrip, skrip ini akan mencari argumen pertama yang disediakan pada baris perintah, dan mengembalikan file terbesar di direktori itu. Script tidak memeriksa kesalahan, tetapi harus memberi Anda ide tentang cara mendekati ini dengan Python, yang memberi Anda cara independen platform bagus untuk menyelesaikan masalah ini.

Luke Pafford
sumber
0

Varian dari jawaban ini dari pertanyaan serupa

find . -type f -exec du -ah {} + | sort -rh | more
crizCraig
sumber
0

Coba perintah di bawah ini dengan opsi sortir untuk memiliki folder dengan ukuran dalam urutan menaik

du -sh * | sort -sh

Dhaval H. Nena
sumber
-1

Sesuatu yang berfungsi pada platform apa pun kecuali AIX dan HP-UX adalah:

find . -ls | sort +6 | tail
schily
sumber