Comment lister les fichiers par type avec ls?


20

Lorsque j'utilise la lscommande avec l'option -l, la première chaîne de lettres donne les informations sur chaque fichier et la première lettre de cette chaîne donne le type du fichier. ( d= répertoire, -= fichier standard, l= lien, etc.)

Comment filtrer les fichiers en fonction de cette première lettre?


2
Pensez à ce que vous voulez: superuser.com/a/109542
devnull

Réponses:


9

Vous pouvez filtrer tout sauf les répertoires de grepcette façon:

ls -l | grep '^d'

le ^indique que le motif se trouve au début de la ligne. Remplacer dpar -, l, etc., selon le cas.

Vous pouvez bien sûr utiliser d'autres commandes pour rechercher directement des types spécifiques (par exemple find . -maxdepth 1 -type d) ou ls -l | sortpour regrouper des types similaires en fonction de ce premier caractère, mais si vous souhaitez filtrer, vous devez utiliser greppour sélectionner uniquement les lignes appropriées dans la sortie.


Notez que si vous avez des liens symboliques, vous voudrez peut-être utiliser ls -lL. -Lsuivra les liens symboliques pour montrer s'il est lié à un répertoire ou à un fichier.
Nux

8

Si vous souhaitez afficher toutes les sorties mais que les fichiers de type similaire sont répertoriés ensemble, vous pouvez trier les sorties sur le premier caractère de chaque ligne:

ls -l | sort -k1,1

Une raison pour le downvote?
Joseph R.

1
Probablement en raison de l'utilisation d'une routine de traitement de texte, la manipulation de texte brut est perçue comme «peu cool» ou «erronée» par certains types de développeurs (comme la plupart de mes collègues ...). Compte tenu d'un vote positif pour une réponse simple et correcte.
Mark K Cowan

8

La commande lstraite des noms de fichiers , qui sont enregistrés dans les structures de données du répertoire. Il ne se soucie donc pas vraiment du fichier lui-même, y compris du "type" d'un fichier.

Une commande qui est plus adaptée pour travailler sur des fichiers réels , pas seulement ses noms, l'est find. Il a une option qui répond directement à votre question sur la façon de filtrer la liste sur le type de fichier.

Cela donne une liste du répertoire actuel similaire à ls -l:

find . -maxdepth 1 -ls

Par défaut, findrépertorie les répertoires de manière récursive, ce qui est désactivé en limitant la profondeur de recherche à 1.
Vous pouvez laisser de côté le ., mais je l'ai inclus pour montrer que les répertoires doivent être répertoriés avant les options.

Avec -type, vous pouvez filtrer par type de fichier, qui s'exprime sous la forme fou dpour des fichiers ou répertoires simples:

find . -maxdepth 1 -type d -ls

Il existe d'autres valeurs de filtre pour -type, notamment lpour les liens symboliques.
Notez qu'il y a une complication avec les liens symboliques :
il y a deux types de fichier dans ce cas l:, indiquant un lien symbolique, et quelque chose comme f, indiquant le type du fichier lié. Il existe des options pour spécifier comment gérer cela, vous pouvez donc choisir.


De man find:

    -type c
           File is of type c:

           b      block (buffered) special

           c      character (unbuffered) special

           d      directory

           p      named pipe (FIFO)

           f      regular file

           l      symbolic link; this is never true if the  -L  option
                  or  the -follow option is in effect, unless the sym‐
                  bolic link is broken.  If you  want  to  search  for
                  symbolic links when -L is in effect, use -xtype.

           s      socket

           D      door (Solaris)

et pertinentes pour la gestion des liens symboliques:

    -xtype c
           The  same as -type unless the file is a symbolic link.  For
           symbolic links: if the -H or -P option was specified,  true
           if the file is a link to a file of type c; if the -L option
           has been given, true if c is `l'.  In other words, for sym‐
           bolic  links, -xtype checks the type of the file that -type
           does not check.

et

    -P     Never follow symbolic links.  This is  the  default  behav‐
           iour.  When find examines or prints information a file, and
           the file is a symbolic link, the information used shall  be
           taken from the properties of the symbolic link itself.


    -L     Follow symbolic links.  When find examines or prints infor‐
           mation about files, the information  used  shall  be  taken
           from  the  properties of the file to which the link points,
           not from the link itself (unless it is  a  broken  symbolic
           link  or  find  is  unable to examine the file to which the
           link points).  Use of this option implies -noleaf.  If  you
           later  use  the -P option, -noleaf will still be in effect.
           If -L is in effect and find discovers a symbolic link to  a
           subdirectory during its search, the subdirectory pointed to
           by the symbolic link will be searched.

           When the -L option is in effect, the -type  predicate  will
           always  match  against the type of the file that a symbolic
           link points to rather than the link itself (unless the sym‐
           bolic  link  is  broken).   Using  -L causes the -lname and
           -ilname predicates always to return false.


    -H     Do not follow symbolic links, except while  processing  the
           command  line  arguments. [...]

2

Si vous souhaitez surtout commander les dossiers des autres types de fichiers, vous pouvez utiliser

ls --group-directories-first

sinon, je pense que vous devez diriger la sortie de ls -l via sort ou grep comme l'a répondu Anthon


2
ls -l | awk '/^d/{print $NF}

awk va attraper tout ce qui commence par d. comme d pour le répertoire et vous devez imprimer le dernier champ pour lister le nom du répertoire


1
ls -l | sort 

Cela triera le résultat selon l'ordre alphabétique de chaque résultat. Si le premier caractère est le critère que vous voulez, c'est tout. Si vous avez seulement besoin des noms de fichiers, vous pouvez essayer:

ls -l | sort | cut -f 2 -d ' ' 

Ou quelque chose de similaire (cette commande trie puis fractionne chaque ligne à l'aide du délimiteur d'espace, puis renvoie le deuxième groupe.


merci pour l'édition Tico, il est difficile de voir ce que vous tapez sur le téléphone.
Fabio
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.