Maison > Article > développement back-end > Trier les éléments d'un répertoire par taille décroissante à l'aide de Python, PowerShell, C# ou Go
Un programme simple pour trier tous les éléments d'un répertoire, qu'il s'agisse d'un fichier ou d'un dossier, par taille décroissante.
Trier les éléments d'un répertoire par taille décroissante n'est pas aussi simple qu'on pourrait le penser, que vous utilisiez un navigateur de fichiers graphique ou la ligne de commande, car les systèmes d'exploitation ne calculent pas la taille totale du contenu d'un répertoire lors de la navigation dans un répertoire. arbre. Cet article propose des programmes de travail complets pour surmonter ce problème sur la plupart des systèmes d'exploitation.
Peut-être trouverez-vous le familier suivant :
Que ce soit pour le travail ou pour des projets personnels, j'aime organiser mes actifs numériques en créant un répertoire parent, disons appelé Projets, et en y stockant tout le contenu des projets individuels. Si un projet est petit et n’implique pas beaucoup de contenu, j’utiliserai un seul fichier, généralement un fichier texte. Si un projet implique plus de contenu, par exemple un fichier texte ainsi que quelques captures d'écran, je créerai un dossier pour ce projet et y placerai tous les éléments associés. Ainsi, de mon point de vue, le fichier texte unique et le dossier sont équivalents dans le sens où chacun représente un projet. La seule différence est que le dossier représente un projet plus important, avec plus de choses.
Parfois, je veux voir lequel de mes projets est actuellement le plus grand, lequel contient le plus de choses. Cela arrive généralement parce que je n'ai pas travaillé sur un domaine particulier depuis un certain temps, donc quand j'y reviens, je veux voir quel projet a le plus de contenu. Mon raisonnement est que le projet avec le plus de contenu doit être le plus complet, et donc probablement celui sur lequel je devrais commencer à travailler en premier, car il sera le plus simple à terminer.
Par exemple, considérons un répertoire avec le contenu suivant :
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 |
Le tri du répertoire ci-dessus par taille décroissante devrait afficher :
Huge Project.txt 2.6KB Big Project.txt 2.11KB Larger Project 1.07KB Basic Project.txt 0.36KB 0 - Tiny Project 0KB
Cependant, ce n'est pas ce que nous obtenons lorsque nous cliquons sur l'en-tête de colonne Taille dans les navigateurs de fichiers graphiques sous Windows, Mac et Linux.
L'utilisation de la ligne de commande fournit un résultat un peu plus proche de celui souhaité, mais toujours pas tout à fait correct :
dir /b/o:-d
Sortie :
Larger Project 0 - Tiny Project Huge Project.txt Big Project.txt Basic Project.txt
Il existe différentes combinaisons de commandes pour le tri du contenu des répertoires sur les systèmes UNIX tels que Mac et Linux. La plupart impliquent l’utilisation de du, sort et ls. D'autres exemples que j'ai trouvés en ligne ont également ajouté find et grep au mix.
Voici ceux que j'ai essayés :
du -a -h --max-profondeur=1 | trier -hr
Sortie :
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
L'utilisation du commutateur -S sur la commande ls est censée faire exactement ce que je recherche, trier les éléments par taille décroissante.
ls -S
Sortie :
'0 - Tiny Project' 'Larger Project' 'Huge Project.txt' 'A - Big Project.txt' 'Basic Project.txt'
La sortie est toujours désactivée. J'ai essayé d'ajouter le commutateur -l (long).
ls -lS
Sortie :
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'
Le résultat comprend plus de détails, comme prévu, mais l'ordre de tri est le même qu'auparavant.
Bien que le résultat des différentes commandes ne fournisse pas le résultat souhaité, il met en évidence la cause première du problème. Lors de la navigation dans une arborescence de répertoires, les systèmes d'exploitation ne parcourent pas les dossiers pour calculer la taille totale de leur contenu. Au lieu de cela, ils traitent tous les dossiers comme ayant la même taille fixe. Il s'agit généralement de la taille de bloc minimale du système de fichiers, généralement 4 096 octets, 4 Ko.
Il doit y avoir au moins une douzaine d'outils gratuits qui résolvent ce problème, mais pour être honnête, je n'ai même pas regardé. Écrire un script/programme qui fait la même chose, puis le partager ici me semblait que ce serait plus facile, impliquerait moins de ballonnements, utile pour les autres, et certainement plus amusant.
J'ai tergiversé assez longtemps. Voici le code :
Huge Project.txt 2.6KB Big Project.txt 2.11KB Larger Project 1.07KB Basic Project.txt 0.36KB 0 - Tiny Project 0KB
Larger Project 0 - Tiny Project Huge Project.txt Big Project.txt Basic Project.txt
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
'0 - Tiny Project' 'Larger Project' 'Huge Project.txt' 'A - Big Project.txt' 'Basic Project.txt'
Il existe quelques différences mineures entre les quatre implémentations, mais l'approche générale utilisée pour les quatre est la même :
Sur la ligne de commande, transmettez le chemin du répertoire que vous souhaitez trier comme premier paramètre. Je ne listerai pas tous les exemples possibles, mais en voici quelques-uns, en supposant que vous avez copié le code et l'avez enregistré sous le nom de fichier dir_desc, abréviation de « répertoire décroissant », plus l'extension de fichier appropriée :
Utiliser Python sur Mac ou Linux :
python3 dir_desc.py
Utiliser PowerShell sous Windows :
powershell -f dir_desc.ps1
J'ai porté mon approche originale en Python vers quelques autres langages, afin qu'il existe au moins une version qui devrait fonctionner sur chacun des trois principaux systèmes d'exploitation :
Et c'est tout. Un autre yak, rasé. J'espère que vous avez trouvé cela utile.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!