web-dev-qa-db-fra.com

Lister uniquement les fichiers normaux (mais pas les répertoires) dans le répertoire courant

Je peux utiliser ls -ld */ pour répertorier toutes les entrées du répertoire dans le répertoire actuel. Existe-t-il un moyen tout aussi simple de répertorier tous les fichiers normaux du répertoire actuel? Je sais que je peux utiliser find

find . -maxdepth 1 -type f

ou stat

stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-

mais ceux-ci ne me semblent pas trop élégants. Existe-t-il un bon moyen de répertorier uniquement les fichiers normaux (je ne me soucie pas des périphériques, des tuyaux, etc.) mais pas des sous-répertoires du répertoire actuel? Énumérer des liens symboliques serait également un plus, mais ce n'est pas une nécessité.

132
daniel kullmann

Avec zsh et Glob Qualifiers vous pouvez facilement l'exprimer directement, par exemple:

echo *(.)

renverra uniquement la liste des fichiers standard ou une erreur en fonction de votre configuration.

Pour les non-répertoires:

echo *(^/)

(comprendra des liens symboliques (y compris vers des répertoires), des canaux nommés, des périphériques, des sockets, des portes ...)

echo *(-.)

pour les fichiers normaux et les liens symboliques vers des fichiers normaux.

echo *(-^/)

pour les non-répertoires et aucun lien symbolique vers les répertoires non plus.

Consultez également le qualificatif de globalisation D si vous souhaitez inclure [~ # ~] d [~ # ~] fichiers ot (masqués fichiers), comme *(D-.).

36
Ulrich Dangel
ls -p | grep -v / 

Cette commande répertorie tous les fichiers non cachés qui ne sont pas des répertoires (fichiers normaux, liens, fichiers de périphérique , etc.). Pour inclure également des fichiers masqués, ajoutez le -A option pour ls

Il suppose qu'aucun des fichiers ne contient de caractères de nouvelle ligne dans leur nom. Ajout d'un -q l'option en ls transformerait tous les caractères non imprimables, y compris la nouvelle ligne en ?, garantissant qu'ils sont sur une seule ligne et donc adaptés à l'alimentation d'un utilitaire basé sur la ligne comme grep et à l'impression sur un terminal.

177
Athul Biju

Pour répertorier uniquement les fichiers standard:

ls -al | grep '^-'

Avec des liens symboliques (vers tout type de fichier) inclus:

ls -al | grep '^[-l]'

Où le premier caractère de la liste décrit le type de fichier, donc - signifie que c'est un fichier normal, car le lien symbolique est l.

Debian/Ubuntu

Imprimez les noms de tous les fichiers correspondants (y compris les liens):

run-parts --list --regex . .

Avec des chemins absolus:

run-parts --list --regex . "$PWD"

Imprime les noms de tous les fichiers dans /etc commençant par p et se terminant par d:

run-parts --list --regex '^p.*d$' /etc
24
kenorb

ls n'a pas d'option pour le faire, mais une des choses intéressantes sur unix et linux est que les pipelines longs et inélégants peuvent facilement être transformés en script, fonction ou alias Shell. et ceux-ci peuvent, à leur tour, être utilisés dans des pipelines comme tout autre programme.

(REMARQUE: il existe des problèmes de portée avec les fonctions et les alias. Les scripts sont disponibles pour tout exécutable qui peut les lire et les exécuter. Les alias et les fonctions ne sont disponibles que dans le shell actuel - bien que .profile/.bashrc, etc. d'un sous-shell, puisse redéfinir et ainsi les rendre disponibles. En outre, un script peut être écrit dans n'importe quelle langue - y compris bash/sh, awk, Perl, python et autres - selon celle qui convient le mieux au travail ou que vous connaissez le mieux)

par exemple.

alias lsf='find . -maxdepth 1 -type f -print0 | xargs -0r ls'

J'ai ajouté des xargs pour que vous puissiez utiliser toutes les options habituelles ls, par exemple lsf -lrS

Parce qu'il utilise find, tous les fichiers dot normalement cachés seront affichés, et tous les noms de fichiers seront préfixés avec ./ - c'est à peu près la seule différence que vous remarquerez.

Vous pouvez exclure les fichiers dot avec ! -iname '.*' mais il faudrait alors avoir deux versions de l'alias - une qui affiche les fichiers de points et une qui ne les affiche pas.

alias lsf2='find . -maxdepth 1 -type f -a ! -iname '\''.*'\'' -print0 | xargs -0r ls'

Alternativement, si lsf était un script plutôt qu'un alias, vous pouvez analyser les options (peut-être avec getopts ou/usr/bin/getopt ou similaire), et exclure les fichiers de points à moins que -a était présent.

15
cas
bash-4.2$ ls -F | grep -v '[/@=|]$' | more

L'option -F de ls ajoute * aux exécutables,/aux répertoires, @ aux liens symboliques, = aux sockets et | aux FIFO. Vous pouvez ensuite utiliser grep pour exclure les caractères de fichier non réguliers de la sortie et vous avez les fichiers. Cela fonctionnera dans n'importe quel shell, pas seulement zsh.

Les faiblesses sont:

  1. Tout fichier dont le nom se termine par @, = ou | sera exclu (mais vous ne devriez pas vraiment avoir de fichiers avec ces caractères dans le nom)
  2. Cela n'exclut pas les fichiers de périphérique ou certains types de fichiers exotiques sur certains systèmes comme les portes.
  3. Un astérisque sera ajouté à tout fichier exécutable. Cela pourrait être géré en passant par sed pour supprimer tous les caractères "*" de la sortie.
  4. Cela ne fonctionne pas correctement s'il existe des noms de fichiers contenant des caractères de nouvelle ligne.
8
kurtm

Le manuel a déclaré que l'option 'f' est uniquement contre le 'fichier normal', pas les tuyaux, les sockets ou les périphériques block/char, ce qui signifie que vous faites déjà les bonnes choses.

   -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 symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

          s      socket

          D      door (Solaris)
3
daisy

Ce n'est pas particulièrement court mais vous pouvez le transformer en script ou alias si vous avez besoin de l'appeler rapidement. En utilisant la commande ls comme tableau d'entrée, appelez ls -ld sur chaque entrée dirigée vers grep pour exclure les répertoires avec la sortie envoyée à null, et en cas de succès, faites écho à l'entrée d'origine:

for list in `ls` ; do ls -ld $list | grep -v ^d > /dev/null && echo $list ; done ;

Vous pouvez inverser la sortie grep et conditionnelle, mêmes résultats:

for list in `ls` ; do ls -ld $list | grep ^d > /dev/null || echo $list ; done ;
0
Don R

Il s'agit d'un fil un peu ancien, mais le moyen le plus propre de répertorier les fichiers uniquement.

ls -al | grep '^-' | awk '{print $9}'
0
R J