Heim >Backend-Entwicklung >Golang >Sortieren Sie Elemente in einem Verzeichnis nach absteigender Größe mit Python, PowerShell, C# oder Go

Sortieren Sie Elemente in einem Verzeichnis nach absteigender Größe mit Python, PowerShell, C# oder Go

Patricia Arquette
Patricia ArquetteOriginal
2024-11-08 08:34:02408Durchsuche

Ein einfaches Programm zum Sortieren aller Elemente in einem Verzeichnis, seien es Dateien oder Ordner, nach absteigender Größe.

Das Sortieren von Elementen in einem Verzeichnis nach absteigender Größe ist nicht so einfach, wie Sie vielleicht denken, unabhängig davon, ob Sie einen grafischen Dateibrowser oder die Befehlszeile verwenden, da Betriebssysteme beim Durchsuchen eines Verzeichnisses nicht die Gesamtgröße des Inhalts eines Verzeichnisses berechnen Baum. Dieser Artikel bietet vollständige Arbeitsprogramme, um dieses Problem auf den meisten Betriebssystemen zu beheben.

Problem

Vielleicht kommt Ihnen Folgendes bekannt vor:

Ob für die Arbeit oder für persönliche Projekte, ich organisiere meine digitalen Assets gerne, indem ich ein übergeordnetes Verzeichnis erstelle, sagen wir eines namens „Projekte“, und dort alle Inhalte für die einzelnen Projekte speichere. Wenn ein Projekt klein ist und nicht viel Inhalt umfasst, verwende ich eine einzelne Datei, normalerweise eine Textdatei. Wenn ein Projekt mehr Inhalt umfasst, beispielsweise eine Textdatei sowie ein paar Screenshots, erstelle ich einen Ordner für dieses Projekt und lege alle zugehörigen Assets dort ab. Aus meiner Sicht sind die einzelne Textdatei und der Ordner also in dem Sinne gleichwertig, dass sie jeweils ein Projekt darstellen. Der einzige Unterschied besteht darin, dass der Ordner ein größeres Projekt mit mehr Inhalten darstellt.

Manchmal möchte ich sehen, welches meiner Projekte derzeit das größte ist, welches die meisten Sachen hat. Das passiert normalerweise, weil ich längere Zeit nicht an einem bestimmten Bereich gearbeitet habe. Wenn ich also darauf zurückkomme, möchte ich sehen, welches Projekt den meisten Inhalt hat. Meine Argumentation ist, dass das Projekt mit den meisten Inhalten das vollständigste sein sollte und ich daher wahrscheinlich zuerst mit der Arbeit beginnen sollte, da es am einfachsten zu beenden ist.

Stellen Sie sich beispielsweise ein Verzeichnis mit folgendem Inhalt vor:

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

Das Sortieren des obigen Verzeichnisses nach absteigender Größe sollte Folgendes ausgeben:

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

Dies ist jedoch nicht das, was wir erhalten, wenn wir in grafischen Dateibrowsern unter Windows, Mac und Linux auf die Spaltenüberschrift „Größe“ klicken.

Windows

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

Windows-Datei-Explorer – Die Dateien werden nach absteigender Größe sortiert und die Ordner werden darunter in aufsteigender alphabetischer Reihenfolge angezeigt.

Mac

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

MacOS Finder – Die Verzeichnisinhalte sind genauso sortiert wie unter Windows.

Linux

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

Linux (Ubuntu) Dateien-App – Die Ordner und Dateien sind korrekt sortiert, aber einzeln; Zuerst Ordner, dann Dateien. Das Element, das zuerst in der Liste erscheint, ist also nicht das größte Element im Verzeichnis.

Die Verwendung der Befehlszeile liefert eine Ausgabe, die der gewünschten etwas näher kommt, aber immer noch nicht ganz korrekt ist:

Windows

dir /b /o:-d

Ausgabe:

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

Mac und Linux

Es gibt verschiedene Befehlskombinationen zum Sortieren von Verzeichnisinhalten auf UNIX-basierten Systemen wie Mac und Linux. Die meisten beinhalten die Verwendung von du, sort und ls. Andere Beispiele, die ich online gefunden habe, fügten ebenfalls „find“ und „grep“ hinzu.

Hier sind die, die ich ausprobiert habe:

du | Sortieren

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

Ausgabe:

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

Die Verwendung des Schalters -S im Befehl ls soll genau das tun, was ich suche: Elemente nach absteigender Größe sortieren.

ls -S

Ausgabe:

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

Der Ausgang ist immer noch ausgeschaltet. Ich habe versucht, den Schalter -l (lang) hinzuzufügen.

ls -lS

Ausgabe:

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'

Die Ausgabe enthält erwartungsgemäß mehr Details, aber die Sortierreihenfolge ist dieselbe wie zuvor.

Grundursache

Während die Ausgabe der verschiedenen Befehle nicht die gewünschte Ausgabe liefert, verdeutlicht sie doch die Grundursache des Problems. Beim Durchsuchen eines Verzeichnisbaums rekursieren Betriebssysteme nicht auf Ordner, um die Gesamtgröße ihres Inhalts zu berechnen. Stattdessen gehen sie davon aus, dass alle Ordner die gleiche feste Größe haben. Normalerweise ist dies die minimale Blockgröße des Dateisystems, üblicherweise 4096 Bytes, 4 KB.

Lösung

Es muss mindestens ein Dutzend kostenlose Tools geben, die dieses Problem lösen, aber um ehrlich zu sein, habe ich nicht einmal nachgeschaut. Ein Skript/Programm zu schreiben, das das Gleiche tut, und es dann hier zu teilen, schien einfacher zu sein, weniger aufdringlich zu sein, hoffentlich nützlich für andere und auf jeden Fall mehr Spaß zu machen.

Ich habe lange genug geschwafelt. Hier ist der Code:

Python

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-Scharf

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

Gehen

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

Es gibt einige geringfügige Unterschiede zwischen den vier Implementierungen, aber der allgemeine Ansatz für alle vier ist derselbe:

  1. Erstellen Sie eine rekursive Funktion, die eine Sammlung von Schlüssel-Wert-Paaren aus Elementname (Datei oder Ordner) und Größe zurückgibt.
  2. Führen Sie in der Hauptfunktion oder im Hauptblock eine grundlegende Eingabevalidierung durch, und wenn der Benutzer einen gültigen Pfad angegeben hat, führen Sie die rekursive Funktion auf diesem Pfad aus.
  3. Sortieren Sie die Ausgabe der rekursiven Funktion nach Wert (Größe) in absteigender Reihenfolge.
  4. Drucken Sie die sortierte Ausgabe auf der Konsole. Jede gedruckte Zeile folgt dem Format: dem Elementnamen, gefolgt von einem Tabulatorzeichen, gefolgt von der Elementgröße geteilt durch 1024 und auf zwei Dezimalstellen gerundet, um die Größe in Kilobyte zu erhalten, gefolgt von „KB“, um die Größeneinheit anzugeben.

Verwendung

Übergeben Sie in der Befehlszeile als ersten Parameter den Pfad zu dem Verzeichnis, das Sie sortieren möchten. Ich werde nicht alle möglichen Beispiele auflisten, aber hier sind ein paar, vorausgesetzt, Sie haben den Code kopiert und unter dem Dateinamen dir_desc, kurz für „Verzeichnis absteigend“, plus der entsprechenden Dateierweiterung gespeichert:

Python auf Mac oder Linux verwenden:

python3 dir_desc.py

Verwenden von PowerShell unter Windows:

powershell -f dir_desc.ps1

Unterschiede zwischen Sprachen und Implementierungen

  • Python und Go ähneln C und anderen C-ähnlichen Sprachen darin, dass das erste Befehlszeilenargument das zweite Element im args-Array ist. In den .NET-Sprachen PowerShell und C# ist das erste Argument das erste Element im args-Array.
  • In PowerShell ist es nicht erforderlich, eine separate rekursive Funktion zu erstellen, da das gewünschte Ergebnis einfacher durch die Verwendung der integrierten Cmdlets Get-ChildItem (gci) und Measure-Object (measure) erreicht werden kann.
  • In Go erfordert das Sortieren einer Sammlung von Schlüssel-Wert-Paaren (Map) nach Wert ein paar Zeilen mehr Code als in anderen Sprachen, da die integrierten Sortierfunktionen für die Arbeit mit Arrays/Slices und nicht für Maps konzipiert sind.
  • In Go wird das Runden einer Gleitkommazahl auf .Round()-Funktion. Wenn Sie einen C-Hintergrund haben, ist dies wahrscheinlich intuitiv. Für den Rest von uns ist es etwas bizarr, funktioniert aber gut.

Ich habe meinen ursprünglichen Ansatz in Python auf einige andere Sprachen portiert, sodass es mindestens eine Version gibt, die auf jedem der drei großen Betriebssysteme funktionieren sollte:

  • Mac und Linux: Der Python3-Interpreter sollte standardmäßig installiert sein. Wenn nicht, können Sie die Go-Version verwenden. Auf einigen Linux-Systemen ist möglicherweise standardmäßig eine Version von gcc installiert, die Go kompilieren kann, auf den meisten Systemen jedoch nicht, sodass Sie den Go-Compiler herunterladen müssen.
  • Windows: Die PowerShell-Version sollte auf Systemen mit Windows 10 oder höher sofort funktionieren. Für ältere Systeme ist die C#-Version wahrscheinlich die bessere Wahl. Sie können den in Windows integrierten C#-Compiler verwenden, um den Code zu kompilieren.

Und das ist es. Noch ein Yak, rasiert. Ich hoffe, Sie fanden das hilfreich.

Das obige ist der detaillierte Inhalt vonSortieren Sie Elemente in einem Verzeichnis nach absteigender Größe mit Python, PowerShell, C# oder Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn