Comment faire pour que ls trie par extension de fichier puis nomme?


44

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 le fait l'explorateur Windows en fonction du type de colonne. Y a-t-il un moyen de faire quelque chose de similaire avec ls?

Réponses:


42

Je pense que la réponse complète est plutôt une combinaison de ce qui précède.

-X (later --sort=extension)est supporté sous Linux depuis au moins FC3 et triera par extension. --group-directories-firsta é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.


5
Je sais que ce message est plutôt ancien, mais à d’autres personnes venant ici, par exemple de Google (comme je l’ai fait): La combinaison de --sort=extensionet --group-directories-first(ou seulement --group-directories) fonctionne bien pour moi sur Ubuntu 12.10. Vaut le coup sur votre machine aussi! =)
Tomas Aschan

Oui, aucun problème de combinaison -X / --sort=extensionavec --group-directories-firstet tout ce que j'ai essayé avec les distributions Linux modernes. Le PO fait référence à Fedora Core 8 (sorti en 2007), il est donc probable que de tels problèmes remontent à un passé lointain.
Matte

23

Sur Linux,

$ ls --group-directories-first

( man lsest votre ami!)


1
voté IN SPITE du commentaire rtfm.
Sridhar Sarnobat

gls --group-directories-firstsur Mac si vous installez GNU Core utilssur homebrew
To Kra


13

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:

  1. comme ça:
  2. chaque ligne est inversée
  3. alors ils sont triés
  4. et inversé encore
  5. ls donne sa sortie, avec tous les drapeaux que vous voulez

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 listé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 | trier | rev
 cslu1
 ls.mp2
 ls.mp3
 ls.mp4
 trees_110214-15
 TAPOTER
 CSLU
 Formulaire de procuration.doc
 finannbyid
 toannbyid
 101209ssi.txt.save
 to_annotate_size
 Matas-time-by-week-integration2.rtf
 cyp3.rtf
 data-dir-scan.perl.doc.rtf
 whence-r21-numid.rtf
 platypus.rtf
 Capture d'écran 2011-01-21 à 14:50 PM.png
 emacs print help.png
 bûche
 new_month_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
 to-palikir.zip
 tmp
 nettoyage de fichier
 bar
 data-scan-docs
 cmp-mg-ann-numids
 nombre_finis
 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
 whence-r21-numid.txt
 finannid.txt
 toannid.txt
 b9-workspace-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
 subventions.txt
 mata-file-reports.txt
 logx.txt
 logx
 b9-workspace-anndiff.txt ~
 bnlinks.txt ~ 

1
Ne répertorie pas les répertoires d'abord, cependant.
CarlF

ce sera le cas si vousls -F
glenn jackman

+1 pour l'effort ...
varun

@ glennjackman c'est mieux. devrait être dans la réponse.
voix

Ce serait bien (surtout avec -F) si on le passe à la loupe revet sortque la couleur n’enlève pas la couleur ( -G).
voix

3

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}//'d'effacer les 8 premiers champs au lieu d'imprimer le 9ème.


En fait, je suis à peu près sûr que cela fonctionnera également sur Linux, mais comme d'autres l'ont déjà indiqué, vous disposez d'un support intégré.
Zac Thompson

1
Fonctionne sur un Mac. Notez que si vous avez CLICOLORactivé, cela supprimera la coloration.
eykanal

1
donnera des résultats incorrects pour les noms de fichiers avec des espaces.
Glenn Jackman

@ glenn, vous avez raison ... si c'était un problème, je remplacerais probablement l'awk par quelque chose qui ressemblerait sed -E -e 's/([^ ]+[ ]+){8}//'à effacer les 8 premiers champs au lieu d'imprimer le 9ème
Zac Thompson

ls -l |sort -d -k 1.1,1.1r -k 9 | cut -c 50-
Nohillside


0

Une bonne approche consiste à séparer les dossiers au début, puis les fichiers triés par extensions , par TRI et par INVERSION:

ls -p | grep /;ls -p | grep -v / | rev | sort | rev

-1

J'ai ajouté à mon .bashrc (linux) la ligne

alias lx = "ls -X"

De cette façon, je tape simplement lx et je le trie par extension.


Donc, la réponse à la question est l'utilisation ls -X:)
Andrew

Ce n'est pas ce qui était demandé
Sridhar Sarnobat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.