Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Isih Item dalam Direktori mengikut Saiz Menurun Menggunakan Python, PowerShell, C# atau Go

Isih Item dalam Direktori mengikut Saiz Menurun Menggunakan Python, PowerShell, C# atau Go

Patricia Arquette
Patricia Arquetteasal
2024-11-08 08:34:02329semak imbas

Atur cara mudah untuk mengisih semua item dalam direktori, sama ada fail atau folder, mengikut saiz menurun.

Mengisih item dalam direktori mengikut saiz menurun tidaklah semudah yang anda fikirkan, sama ada anda menggunakan pelayar fail grafik atau baris arahan, kerana sistem pengendalian tidak mengira jumlah saiz kandungan direktori semasa menyemak imbas direktori pokok. Artikel ini menawarkan program kerja yang lengkap untuk mengatasinya pada kebanyakan sistem pengendalian.

Masalah

Mungkin anda akan mendapati perkara berikut biasa:

Sama ada untuk kerja atau projek peribadi, saya suka mengatur aset digital saya dengan mencipta direktori induk, katakan satu yang dipanggil Projek dan menyimpan semua kandungan untuk projek individu di sana. Jika projek kecil dan tidak melibatkan banyak kandungan, saya akan menggunakan satu fail, biasanya fail teks. Jika projek melibatkan lebih banyak kandungan, sebut fail teks serta beberapa tangkapan skrin, saya akan mencipta folder untuk projek itu dan meletakkan semua aset yang berkaitan di sana. Jadi, dari perspektif saya, fail teks tunggal dan folder adalah setara dalam erti kata masing-masing mewakili projek. Satu-satunya perbezaan ialah folder itu mewakili projek yang lebih besar, satu dengan lebih banyak bahan.

Kadang-kadang saya ingin melihat projek mana yang terbesar pada masa ini, yang mempunyai paling banyak barangan. Ini biasanya berlaku kerana saya telah lama tidak bekerja di kawasan tertentu, jadi apabila saya kembali kepadanya, saya ingin melihat projek mana yang mempunyai kandungan paling banyak. Alasan saya ialah projek dengan kandungan terbanyak mestilah yang paling lengkap, dan oleh itu mungkin projek yang harus saya mulakan dahulu, kerana ia akan menjadi paling mudah untuk diselesaikan.

Sebagai contoh, pertimbangkan direktori dengan kandungan berikut:

Name Type Size
Huge Project.txt File 2.6KB
Larger Project Folder 1.07KB
0 - Tiny Project Folder 0KB
Basic Project.txt File 0.36KB
Big Project.txt File 2.11KB

Isih direktori di atas mengikut saiz menurun akan menghasilkan:

Huge Project.txt        2.6KB
Big Project.txt 2.11KB
Larger Project  1.07KB
Basic Project.txt       0.36KB
0 - Tiny Project        0KB

Walau bagaimanapun, ini bukan apa yang kami dapat apabila kami mengklik pengepala lajur Saiz dalam penyemak imbas fail grafik pada Windows, Mac dan Linux.

Windows

Sort Items in a Directory by Descending Size Using Python, PowerShell, C#, or Go

Windows File Explorer - Fail diisih mengikut saiz menurun dan folder dipaparkan di bawah, dalam susunan abjad menaik.

Mac

Sort Items in a Directory by Descending Size Using Python, PowerShell, C#, or Go

Pencari MacOS - Kandungan direktori diisih sama seperti pada Windows.

Linux

Sort Items in a Directory by Descending Size Using Python, PowerShell, C#, or Go

Apl Fail Linux (Ubuntu) - Folder dan fail diisih dengan betul, tetapi secara individu; folder dahulu, kemudian fail. Jadi item yang muncul pertama dalam senarai sebenarnya bukanlah item terbesar dalam direktori.

Menggunakan baris arahan menyediakan output yang agak hampir dengan yang diingini, tetapi masih tidak betul sepenuhnya:

Windows

dir /b /o:-d

Output:

Larger Project
0 - Tiny Project
Huge Project.txt
Big Project.txt
Basic Project.txt

Mac dan Linux

Terdapat pelbagai kombinasi perintah untuk pengisihan kandungan direktori pada sistem berasaskan UNIX seperti Mac dan Linux. Kebanyakannya melibatkan penggunaan du, sort, dan ls. Contoh lain yang saya temui dalam talian juga turut memasukkan carian dan grep ke dalam campuran.

Inilah yang saya cuba:

du | menyusun

du -a -h --max-depth=1 | sort -hr

Output:

32K     .
8.0K    ./Larger Project
8.0K    ./0 - Tiny Project
4.0K    ./Huge Project.txt
4.0K    ./Big Project.txt
4.0K    ./Basic Project.txt

ls

Menggunakan suis -S pada arahan ls sepatutnya melakukan apa yang saya cari, mengisih item mengikut saiz menurun.

ls -S

Output:

'0 - Tiny Project'  'Larger Project'  'Huge Project.txt'  'A - Big Project.txt'  'Basic Project.txt'

Output masih dimatikan. Saya cuba menambah suis -l (panjang).

ls -lS

Output:

total 20
drwx---r-x 2 admin admin 4096 Sep 20 21:49 '0 - Tiny Project'
drwx---r-x 2 admin admin 4096 Sep 20 21:49 'Larger Project'
-rw-rw-r-- 1 admin admin 2667 Sep 20 21:49 'Huge Project.txt'
-rw-rw-r-- 1 admin admin 2164 Sep 20 21:49 'Big Project.txt'
-rw-rw-r-- 1 admin admin  368 Sep 20 21:49 'Basic Project.txt'

Keluaran termasuk lebih terperinci, seperti yang dijangkakan, tetapi susunan isihan adalah sama seperti sebelumnya.

Punca Punca

Walaupun output pelbagai arahan tidak memberikan output yang diingini, ia menyerlahkan punca masalah. Apabila menyemak imbas pepohon direktori, sistem pengendalian tidak berulang ke dalam folder untuk mengira jumlah saiz kandungannya. Sebaliknya, mereka menganggap semua folder sebagai mempunyai saiz tetap yang sama. Biasanya ini ialah saiz blok minimum sistem fail, biasanya 4096 bait, 4KB.

Penyelesaian

Mesti ada sekurang-kurangnya sedozen alat percuma di luar sana yang menyelesaikan masalah ini, tetapi secara jujur, saya tidak melihat pun. Menulis skrip/program yang melakukan perkara yang sama dan kemudian berkongsi di sini terasa seperti lebih mudah, melibatkan kurang kembung, semoga berguna untuk orang lain, dan pastinya lebih menyeronokkan.

Saya sudah cukup lama melamun. Inilah kodnya:

Ular sawa

Huge Project.txt        2.6KB
Big Project.txt 2.11KB
Larger Project  1.07KB
Basic Project.txt       0.36KB
0 - Tiny Project        0KB

PowerShell

Larger Project
0 - Tiny Project
Huge Project.txt
Big Project.txt
Basic Project.txt

C Tajam

32K     .
8.0K    ./Larger Project
8.0K    ./0 - Tiny Project
4.0K    ./Huge Project.txt
4.0K    ./Big Project.txt
4.0K    ./Basic Project.txt

Pergi

'0 - Tiny Project'  'Larger Project'  'Huge Project.txt'  'A - Big Project.txt'  'Basic Project.txt'

Terdapat beberapa perbezaan kecil antara empat pelaksanaan, tetapi pendekatan umum yang digunakan untuk keempat-empat adalah sama:

  1. Buat fungsi rekursif yang mengembalikan koleksi pasangan nilai kunci nama dan saiz item (fail atau folder).
  2. Dalam fungsi atau blok utama, lakukan beberapa pengesahan input asas dan jika pengguna telah menyediakan laluan yang sah, jalankan fungsi rekursif pada laluan itu.
  3. Isih output fungsi rekursif mengikut nilai (saiz), dalam tertib menurun.
  4. Cetak output yang diisih ke konsol. Setiap baris yang dicetak mematuhi format: nama item, diikuti dengan aksara tab, diikuti dengan saiz item dibahagikan dengan 1024 dan dibundarkan kepada dua tempat perpuluhan untuk mendapatkan saiz dalam kilobait, diikuti dengan "KB" untuk menandakan unit saiz.

Penggunaan

Pada baris arahan, lalukan laluan ke direktori yang anda ingin isikan sebagai parameter pertama. Saya tidak akan menyenaraikan semua contoh yang mungkin, tetapi berikut ialah pasangan, dengan mengandaikan anda telah menyalin kod dan menyimpannya sebagai nama fail dir_desc, singkatan untuk "direktori menurun", serta sambungan fail yang sesuai:

Menggunakan Python pada Mac atau Linux:

python3 dir_desc.py

Menggunakan PowerShell pada Windows:

powershell -f dir_desc.ps1

Perbezaan Antara Bahasa dan Perlaksanaan

  • Python dan Go menyerupai C dan bahasa lain seperti C kerana argumen baris arahan pertama ialah item kedua dalam tatasusunan args. Dalam bahasa .NET, PowerShell dan C#, hujah pertama ialah item pertama dalam tatasusunan args.
  • Dalam PowerShell, tidak perlu mencipta fungsi rekursif yang berasingan, kerana hasil yang diinginkan boleh dicapai dengan lebih mudah dengan menggunakan cmdlet Get-ChildItem (gci) dan Measure-Object (measure) terbina dalam.
  • Dalam Go, mengisih koleksi pasangan nilai kunci (peta) mengikut nilai memerlukan beberapa baris kod lebih banyak berbanding dalam bahasa lain, kerana fungsi pengisihan terbina dalam direka bentuk untuk berfungsi dengan tatasusunan/hirisan, bukan peta.
  • Dalam Go, pembundaran nombor titik terapung kepada X tempat perpuluhan dikendalikan semasa mencetak output, menggunakan fungsi fmt.Printf(), berbanding semasa membundarkan nombor, yang, secara kebetulan, boleh dilakukan tanpa menggunakan matematik Fungsi .Round(). Jika anda mempunyai latar belakang C, ini mungkin intuitif. Bagi kami yang lain, ia agak pelik, tetapi berfungsi dengan baik.

Saya mengalihkan pendekatan asal saya dalam Python kepada beberapa bahasa lain, supaya terdapat sekurang-kurangnya satu versi yang harus berfungsi pada setiap tiga sistem pengendalian utama:

  • Mac dan Linux: sepatutnya mempunyai penterjemah python3 dipasang secara lalai. Jika tidak, anda boleh menggunakan versi Go. Sesetengah sistem Linux mungkin mempunyai versi gcc yang dipasang secara lalai yang boleh menyusun Go, tetapi kebanyakan sistem tidak akan melakukannya, jadi anda perlu memuat turun pengkompil Go.
  • Windows: versi PowerShell sepatutnya berfungsi di luar kotak pada sistem dengan Windows 10 atau lebih baru. Untuk sistem yang lebih lama, versi C# mungkin merupakan pilihan yang lebih baik. Anda boleh menggunakan pengkompil C# terbina dalam Windows untuk menyusun kod.

Dan itu sahaja. Satu lagi yak, dicukur. Saya harap anda mendapati ini berguna.

Atas ialah kandungan terperinci Isih Item dalam Direktori mengikut Saiz Menurun Menggunakan Python, PowerShell, C# atau Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn