Par défaut, la commande ls trie uniquement par nom de fichier, mais je veux que les répertoires apparaissent avant les autres types de fichiers. Je souhaiterais peut-être même que les fichiers soient triés par extension, comme c'est le cas pour l’explorateur Windows. Y a-t-il un moyen de faire quelque chose de similaire avec ls?
Je pense que la réponse complète est plutôt une combinaison de ce qui précède.
-X (later --sort=extension)
est pris en charge sous Linux depuis au moins FC3 et triera par extension. --group-directories-first
a été ajouté plus récemment (peut-être autour de FC8?). Cependant, combiner les deux ne semble pas fonctionner (du moins sur FC8).
Le problème principal semble être lié à l'utilisation de clés de tri primaires singulières. Voir cette discussion sur la liste de diffusion pour un aperçu de celle-ci.
Sur Linux,
$ ls --group-directories-first
(man ls
est votre ami!)
-X est l'option que vous recherchez:
ls -lX
Sur Bash, cela va trier:
$ ls | rev | sort | rev
De man rev
:
The rev utility copies the specified files to the standard output,
reversing the order of characters in every line. If no files are speci-
fied, the standard input is read.
Donc 1. ls donne sa sortie, avec tous les drapeaux que vous voulez 2. chaque ligne est inversée 3. puis ils sont triés 4. puis inversés 5. comme ceci:
Ou, plus précisément, comme ci-dessous. Ils sont triés par dernier caractère, puis avant-dernier, etc. Tous les fichiers .rtf, par exemple, sont répertoriés ensemble, après un fichier .save et un autre fichier sans extension dont le nom se termine par 'e'. Viennent ensuite les fichiers .png, et ainsi de suite. Cela fonctionnera également avec ls -l, car l'extension est normalement la dernière chose sur la ligne (exceptions si vous avez des lignes telles que "tmp @ ->/home/jones/tmp", où les liens sont suivis par leurs cibles).
$ ls | rev | sort | rev cslu1 ls.mp2 ls.mp3 ls.mp4 trees_110214-15 PAT CSLU Proxy Form.doc Finannbyid Toannbyid 101209ssi.txt.save À_annotate_size Matas-time -by-week-integration2.rtf cyp3.rtf répertoire-données-scan.Perl.doc.rtf d'où-r21-numid.rtf ornithorynque .rtf Capture d'écran 2011-01-21 à 14:17 h .png emacs print help.png journal nouveau_mois_log spécial Google-ngram-critique.html Perl_path.html Nl DWE_BEN_89808.2.ann Foo Dofoo 100811_from_iMac_Documents_in_dock.Zip À-palikir.Zip Tmp Nettoyage de fichier Bar Data-scan-docs cmp-mg-ann-numids finish_numids to_annotate_numids manls.ps Mike_address_ticket cyp2.out cyp3.out localiser-cyp.out manls.out DWE_BEN_89808.2.text [.___ _.] tag2.txt l2.txt du-h-d3.txt finish_ann_numids_110407_1714.txt finish_all_numids_110407_1718.txt data-dir -scan.Perl.doc.txt où-r21-numid.txt finannid.txt toannid.txt b9-workpace-anndiff.txt tag.txt duh.txt do-mail.txt safextn.txt mg3longhdr.txt finish_numids.txt 41692-langnames.txt TimeAnnotationGuidelines.txt 41langs.txt Chose4-homedir-links.txt Bnlinks.txt .txt mata-file-reports.txt logx.txt logx b9-workpace-anndiff.txt ~ bnlinks.txt ~
Si vous n'êtes pas sur Linux,
ls -l |sort -d -k 1.1,1.1r -k 9 |awk '{print $9}'
devrait trier les répertoires en premier (laissez-moi savoir si je me trompe). Ne trie pas par extension cependant: vous devez faire la déclaration awk beaucoup plus occupée si vous voulez le faire ...
Pour que cela fonctionne également avec des noms contenant des espaces, je remplacerais probablement l'awk par quelque chose comme sed -E -e 's/([^ ]+[ ]+){8}//'
pour effacer les 8 premiers champs au lieu d'imprimer le 9ème.
Si vous utilisez Linux, GNU ls
supporte l'option --sort
: -
ls --sort=extension
Une bonne approche consiste à séparer les dossiers dans un premier temps, puis les fichiers triés par extensions , en triant et en inversant:
ls -p | grep /;ls -p | grep -v / | rev | sort | rev