web-dev-qa-db-fra.com

Comment faire pour que ce soit une extension de fichier puis nomme?

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?

41
allyourcode

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.

39
CS

Sur Linux,

$ ls --group-directories-first

(man ls est votre ami!)

22
Ned Deily

-X est l'option que vous recherchez:

ls -lX
13
Carl Manaster

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 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 ~ 
11
M. Mandel

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.

3
Zac Thompson

Si vous utilisez Linux, GNU ls supporte l'option --sort: -

ls --sort=extension
2
DaveR

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
0
PYK