178 votes

Comment lister uniquement les fichiers et non les répertoires d'un répertoire Bash ?

Comment puis-je lister tous les fichiers d'un dossier mais pas leurs dossiers ou sous-fichiers. En d'autres termes : Comment puis-je lister uniquement les fichiers ?

0 votes

1 votes

Aucun des doublons proposés ne semble mettre en œuvre l'obligation d'omettre les répertoires.

234voto

carlpett Points 4883

Utilisation de find :

find . -maxdepth 1 -type f

Utilisation de la -maxdepth 1 garantit que vous ne regardez que dans le répertoire actuel (ou, si vous remplacez l'option . avec un certain chemin, ce répertoire). Si vous voulez une liste récursive complète de tous les fichiers de ce répertoire et de ses sous-répertoires, supprimez simplement cette option.

0 votes

Après mon commentaire à la réponse de mklement0, j'ai réalisé que "find ./*.png -maxdepth 1 -type f > pngs.txt" ferait probablement la même chose. C'est le cas. Sans installer un script.

2 votes

find sur mac, n'a ni l'un ni l'autre -type ni -maxdepth options.

3 votes

@Tim : -type y -maxdepth ne sont pas options au sens normal du terme ; BSD find (tel qu'utilisé sous OS X) les appelle primaires et ils doivent venir après le(s) opérande(s) nom de fichier ( . dans ce cas ; notez que, contrairement à Linux, la version BSD a besoin d'au moins un opérande de nom de fichier explicite) ; la commande dans cette réponse fonctionne sans aucun doute sur un Mac.

42voto

Dr_Hope Points 317
ls -p | grep -v /

ls -p vous permet d'afficher / après le nom du dossier, qui agit comme une balise que vous pouvez supprimer.

3 votes

Il est agréable de voir un exemple utilisant ls en plus de find puisque le second renvoie des chemins relatifs et le premier uniquement des noms de fichiers. Utilisez le bon outil pour le travail.

10voto

mklement0 Points 12597
  • carlpett's find -réponse fondée sur la loi ( find . -maxdepth 1 -type f ) fonctionne en principe, mais est Ce n'est pas tout à fait la même chose que d'utiliser ls : vous obtenez un potentiellement non trié liste de noms de fichiers tous préfixé avec ./ et vous perdez la possibilité d'appliquer ls Les nombreux options ;
    également find invariablement trouve caché les articles aussi alors que ls Le comportement de l'appareil dépend de la présence ou de l'absence de l'indicateur de performance. -a o -A options.

    • Un site amélioration suggéré par Alex Hall dans un commentaire sur la question est de moissonneuse-batteuse gonflement de la coquille con find :

          find * -maxdepth 0 -type f  # find -L * ... includes symlinks to files
      • Toutefois, si cette résout le problème du préfixe et vous donne une sortie triée par ordre alphabétique. vous n'avez toujours pas de contrôle (en ligne) sur l'inclusion d'éléments cachés ni d'accès à l'option ls Les options de tri et de format de sortie sont nombreuses.
  • Hans Roggeman ls + grep réponse est pragmatique, mais vous enferme dans l'utilisation de longues ( -l ) format de sortie .

Pour remédier à ces limitations, j'ai écrit le fls ( f iltering ls ) utilité ,

  • un utilitaire qui fournit le la flexibilité de la production de ls tout en fournissant capacité de filtrage des types ,
  • en plaçant simplement caractères de filtrage des types comme f pour les fichiers, d pour les répertoires, et l pour les liens symboliques avant une liste de ls arguments (run fls --help o fls --man pour en savoir plus).

Exemples :

fls f        # list all files in current dir.
fls d -tA ~  #  list dirs. in home dir., including hidden ones, most recent first
fls f^l /usr/local/bin/c* # List matches that are files, but not (^) symlinks (l)

Installation

Plateformes prises en charge

  • Lors de l'installation à partir du registre npm : Linux y macOS
  • Lors de l'installation manuellement : tout Unix-like plate-forme avec Bash

De la registre npm

Remarque : Même si vous n'utilisez pas Node.js, son gestionnaire de paquets, npm Il fonctionne sur toutes les plateformes et est facile à installer.
curl -L https://git.io/n-install | bash

Avec Node.js installé, installez comme suit :

[sudo] npm install fls -g

Note :

  • Que vous ayez besoin sudo dépend de la manière dont vous avez installé Node.js / io.js et si vous avez a changé les permissions plus tard ; si vous obtenez un EACCES essayez à nouveau avec sudo .

  • El -g assure mondial installation et est nécessaire pour mettre fls dans le dossier de votre système $PATH .

Installation manuelle

  • Télécharger ce bash script comme fls .
  • Rendez-le exécutable avec chmod +x fls .
  • Déplacez-le ou faites un lien symbolique vers un dossier dans votre dossier $PATH comme /usr/local/bin (macOS) ou /usr/bin (Linux).

8voto

F. Hauri Points 5893

Lister le contenu d'un répertoire, sans les sous-répertoires.

J'aime utiliser ls options, par exemple :

  • -l utiliser un format de liste longue
  • -t trier par temps de modification, le plus récent en premier
  • -r ordre inverse lors du tri
  • -F , --classify ajouter un indicateur (un des */=>@|) aux entrées
  • -h , --human-readable avec -l et -s, imprimer des tailles comme 1K 234M 2G etc...

Parfois, --color et tous les autres. (Voir ls --help )

Lister tout sauf les dossiers

Ceci montrera les fichiers, les liens symboliques, les périphériques, les tuyaux, les sockets, etc.

donc

find /some/path -maxdepth 1 ! -type d

pourraient être triés par date facilement :

find /some/path -maxdepth 1 ! -type d -exec ls -hltrF {} +

Inscription fichiers seulement :

ou

find /some/path -maxdepth 1 -type f

triés par taille :

find /some/path -maxdepth 1 -type f -exec ls -lSF --color {} +

Empêcher l'inscription de entrées cachées :

Pour ne pas afficher les entrées cachées, dont le nom commence par un point, vous pouvez ajouter ! -name '.*' :

find /some/path -maxdepth 1 ! -type d ! -name '.*' -exec ls -hltrF {} +

Puis

Vous pourriez remplacer /some/path por . à inscrire pour répertoire actuel o .. para répertoire parent .

3voto

Hans Roggeman Points 1420

Vous pouvez également utiliser ls con grep o egrep et le mettre dans votre profil comme un alias :

ls -l | egrep -v '^d'
ls -l | grep -v '^d'

0 votes

Je ne mettrais pas cela dans un script pour la raison donnée plus haut, mais une autre solution rapide et sale : ls -F | grep -v '/$'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X