107 votes

Comment trier d'abord les répertoires, puis les fichiers, etc en utilisant "ls" sous Unix ?

Je voudrais utiliser le ls pour afficher d'abord les répertoires puis les fichiers. J'ai essayé :

ls -la | sort -k 1

Mais j'ai reçu une mauvaise commande.

240voto

jonathanserafini Points 2704

J'aime tellement *nix et j'aime voir l'inventivité qui entre dans certaines de ces réponses...

Le mien est loin d'être aussi sophistiqué sous GNU Linux :

alias ls='ls --color -h --group-directories-first'

Étant donné que je suis plus à l'aise avec mes applications CLI linux, j'ai tendance à mettre également à jour coreutils sous OSX :

brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'

33voto

eleven81 Points 14460

La commande suivante listera les répertoires en premier, les fichiers ordinaires en second, et les liens en troisième.

ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"

De plus, il serait très judicieux de créer une alias pour cette commande afin d'économiser les frappes au clavier.

Edit :

Si vous voulez d'abord les répertoires, et ensuite tout ce qui n'est pas un répertoire, utilisez ceci :

ls -la | grep "^d" && ls -la | grep -v "^d"

22voto

Vadym Tyemirov Points 321

Pour les utilisateurs de mac, vous pouvez installer coreutils .

Cette formule fournit les implémentations des utilitaires de base GNU, et pour les commandes qui sont également fournies par macOS, elles ont été installées avec le préfixe "g".

brew install coreutils
gls --color -h --group-directories-first

Vous pouvez encore vous simplifier la vie avec un alias.

alias ls='gls --color -h --group-directories-first'

7voto

thdoan Points 729

Il y a certaines choses que je veux voir dans une liste d'annuaire, et jusqu'à présent aucune des réponses ici ne répond à toutes les exigences ci-dessous. Mes exigences pour une liste d'annuaire :

  1. Les répertoires et les fichiers sont triés par ordre alphabétique.
  2. Les répertoires sont listés en premier
  3. Les liens symboliques (symlinks) sont triés comme des fichiers
  4. Le tri est insensible à la casse
  5. Le triage ignore tous les caractères non alphabétiques en tête d'un nom de fichier.
  6. La liste comprend le nombre total de répertoires (à l'exclusion de ./ y ../ ), des fichiers et des liens
  7. La liste comprend la taille totale (utilisation du disque) des répertoires et des fichiers.
  8. Le listing doit avoir la même apparence sous Linux et Windows (Git Bash Shell) -- c'était le plus difficile à obtenir car des options pratiques comme --group-directories-first ne fonctionnent pas dans Git Bash pour Windows

Après avoir beaucoup bricolé, j'ai finalement trouvé une ligne unique (bien qu'elle soit très longue ;-)) dont je suis satisfait. Je l'ai assigné à un alias nommé 'dir' :

ls -dlF --color * .* | head -n2 && ls -AlF | LC_ALL=C grep "^d" | 
LC_ALL=C sort -k 9df && ls -AlF | LC_ALL=C grep "^[l-]" | 
LC_ALL=C sort -k 9df && echo -e `find -maxdepth 1 -type d ! -name . | 
wc -l` Dir\(s\) `du -hs | cut -f 1`\\t\\t`find -maxdepth 1 -type f | 
wc -l` File\(s\) `find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | 
tail -n 1 | cut -f 1`\\t\\t`find -maxdepth 1 -type l | wc -l` Link\(s\)

Pour rendre les choses plus faciles à gérer, j'ai créé des commandes distinctes pour afficher chaque segment de la liste des répertoires à ma convenance, puis je les ai assemblées en utilisant la commande && opérateur.

  • ls -dlF --color * .* | head -n2 -- Extrait ./ y ../ . Nous ne voulons pas les faire passer par sort parce qu'ils sont déjà dans le bon ordre, et le fait de les trier peut entraîner ../ étant listé en premier. Le site -d option est de se débarrasser de la ligne "total" ; j'aime ajouter -F pour afficher la barre oblique de fin pour les répertoires (il marquera également les liens symboliques avec "@" lorsque vous effectuez une recherche simple de type ls -F ).

  • ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df -- Extraire les répertoires et les trier par nom de fichier (9ème colonne), en ignorant les caractères non-alpha/espace ( d ) et la casse des caractères (option f option). Le site ls -A L'option exclut ./ y ../ de la liste puisque nous les avons déjà extraites à l'étape précédente. J'ai tendance à préfixer tous les grep y sort avec les commandes LC_ALL=C locale reset afin que (1) la sortie soit cohérente à travers les shells Unix, et (2) vous pouvez parfois voir des performances plus rapides car il n'a plus la surcharge du lourd jeu de caractères UTF-8 à gérer.

  • ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df -- Cette étape est similaire à la précédente, mais cette fois-ci, nous trions les fichiers et les liens symboliques.

  • find -maxdepth 1 -type d ! -name . | wc -l -- Obtenez le nombre de répertoires, à l'exclusion ./ y ../ .

  • find -maxdepth 1 -type f | wc -l -- Obtenir le nombre de fichiers.

  • find -maxdepth 1 -type l | wc -l -- Obtenir le nombre de liens symboliques.

  • du -hs | cut -f 1 -- Extraire la taille totale de tous les sous-répertoires dans un format lisible par l'homme.

  • find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1 -- Extraire la taille totale de tous les fichiers dans un format lisible par l'homme.

Voyons voir notre nouvelle dir alias en action !

AVANT :

$ ls -alF
total 22
drwxr-xr-x   13 Tom      Administ     4096 Oct 25 02:38 ./
drwxr-xr-x    3 Tom      Administ        0 Dec 24  2014 ../
drwxr-xr-x   15 Tom      Administ     4096 Sep 17 01:23 .VirtualBox/
-rw-r--r--    1 Tom      Administ      615 Oct 25 02:38 .aliases
-rw-r--r--    1 Tom      Administ    12742 Oct 24 11:47 .bash_history
-rw-r--r--    1 Tom      Administ     3234 Oct 24 15:06 .bash_profile
drwxr-xr-x    1 Tom      Administ        0 Jan 24  2015 .gem/
-rw-r--r--    1 Tom      Administ      586 Oct 24 03:53 .gitconfig
drwxr-xr-x    1 Tom      Administ     4096 Dec 28  2014 .ssh/
drwxr-xr-x    4 Tom      Administ        0 Jan 24  2015 .travis/
-rw-r--r--    1 Tom      Administ     6645 Oct 25 02:38 _viminfo
-rw-r--r--    1 Tom      Administ     4907 Oct 24 15:16 profile
drwxr-xr-x    1 Tom      Administ        0 Oct 24 22:20 tmp/

APRÈS :

$ dir
drwxr-xr-x   13 Tom      Administ     4096 Oct 25 02:38 ./
drwxr-xr-x    3 Tom      Administ        0 Dec 24  2014 ../
drwxr-xr-x    1 Tom      Administ        0 Jan 24  2015 .gem/
drwxr-xr-x    1 Tom      Administ     4096 Dec 28  2014 .ssh/
drwxr-xr-x    1 Tom      Administ        0 Oct 24 22:20 tmp/
drwxr-xr-x    4 Tom      Administ        0 Jan 24  2015 .travis/
drwxr-xr-x   15 Tom      Administ     4096 Sep 17 01:23 .VirtualBox/
-rw-r--r--    1 Tom      Administ      615 Oct 25 02:38 .aliases
-rw-r--r--    1 Tom      Administ    12742 Oct 24 11:47 .bash_history
-rw-r--r--    1 Tom      Administ     3234 Oct 24 15:06 .bash_profile
-rw-r--r--    1 Tom      Administ      586 Oct 24 03:53 .gitconfig
-rw-r--r--    1 Tom      Administ     4907 Oct 24 15:16 profile
-rw-r--r--    1 Tom      Administ     6645 Oct 25 02:38 _viminfo
      5 Dir(s) 2.8M           6 File(s) 31K           0 Link(s)

Un inconvénient mineur est que vous ne pouvez pas avoir de listes colorées, car les caractères de contrôle de couleur entourant les noms de fichiers rendent le tri trop peu fiable.


UPDATE

L'alias ci-dessus était douloureusement lent lorsqu'il était exécuté à partir du répertoire racine d'un système de fichiers profond, j'ai donc mis à jour cette commande plus simple mais beaucoup plus performante :

ls -AFoqv --color --group-directories-first | tail -n +2 && find -maxdepth 1 -type f -printf '%s\n' | awk '{total+=$1} END {print total" bytes"}'

Exemple de sortie :

$ dir
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .aws/
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .gem/
drwxr-xr-x 1 Tom     0 Mar 29 19:32 .ssh/
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .zbstudio/
drwxr-xr-x 1 Tom     0 Jun 16  2016 temp/
drwxr-xr-x 1 Tom     0 Jul 13  2016 vimfiles/
-rw-r--r-- 2 Tom   365 Mar 30 10:37 .aliases
-rw-r--r-- 1 Tom 16028 Mar 30 12:12 .bash_history
-rw-r--r-- 2 Tom  2807 Mar 30 12:12 .bash_profile
-rw-r--r-- 2 Tom  2177 Mar 29 23:24 .functions
-rw-r--r-- 1 Tom  1091 Mar 30 10:34 .gitconfig
-rw-r--r-- 1 Tom  8907 Mar 29 14:45 _viminfo
-rw-r--r-- 1 Tom  2444 Jul 13  2016 _vimrc
33819 bytes

Puisque la nouvelle version de Git Bash pour Windows supporte --group-directories-first nous n'avons plus besoin de nous rabattre sur sort . Même si le nouvel alias n'affiche pas autant d'informations que l'alias précédent, les gains de performance en valent la peine. En prime, vous obtenez aussi des couleurs !

6voto

Studer Points 3660

Vous avez plusieurs choix, selon que vous souhaitez conserver l'ordre alphabétique.

Vous pourriez simplement essayer :

ls -al | sort -k1 -r

ou ceci, pour conserver l'ordre alphabétique des fichiers ayant les mêmes permissions :

ls -al | sort -k1,1 -k9,9 -r

ou, comme l'a dit eleven81 (mais cette version énumère tout) :

ls -la | grep "^d" && ls -la | grep "^-" && ls -al | grep -v "^[d|-]"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X