Comment exclure des répertoires lors de la liste des fichiers?

21

Comment exclure des répertoires lors de la liste des fichiers dans le répertoire actuel?

ls .

^ inclura des répertoires dans la liste.

Stephen Watkins
la source

Réponses:

23

Essaye celui-là:

find . -maxdepth 1 -not -type d
Alexander Gladysh
la source
3
restez simple: $ find. -type f
jamzé
9
Non. (1) il serait récursif, (2) il ne répertorierait pas les liens symboliques. @Steve a demandé l'équivalent de ls .sans répertoires - et le voici.
Alexander Gladysh
2
L'ajout -lsou -exec ls -l {} \;le rendrait comme ls -lsans répertoires.
Ladadadada
15

Pour obtenir exactement l'équivalent de ls .vous, vous ne devez pas afficher les répertoires cachés.

find . -maxdepth 1 -not -type d -and -not -name '.*'

et cela vous laisse toujours avec './' préfixé à chaque nom de fichier. Ce n'est pas vraiment un problème, mais je pense que c'est plutôt moche. J'y suis allé avec:

ls -p | grep -v '/$'

Et cela vous donnera une liste qui se ressemble, et vous pouvez également ajouter des lsarguments supplémentaires . Ajoutez un --color=alwayset vous récupérerez vos dircolors, ou -apour voir les fichiers cachés.

J'aime la réponse d'Alexander car il dépend en fait d'un système de fichiers caractéristique du fichier en question, de sorte qu'il ne sera jamais dupe. Ma réponse sera dupée par un fichier qui a un «/» comme dernier caractère de son nom. Mais cela semble demander des ennuis.

Sean O'Leary
la source
1
'-not' est lié à GNU find, car il n'est pas compatible POSIX, il est préférable de ne pas enseigner ces options car un utilisateur pourrait avoir de "mauvais" habbits et se sentir perdu sur d'autres UNIX :)
jirib
2
@JiriXichtkniha quelle est l'alternative POSIX à -not?
Lucas Gallindo
5

essaye ça:

$ find. -type f -maxdepth 1

ou ca:

$ ls -p | egrep -v / $

$ ls -la | egrep -v ^ d

coincé
la source
3

Bien que ce soit un vieux post, mais j'ai pensé que cela pourrait aider ..

$ ls -l | grep -v ^ d

Il répertorie tous les fichiers, y compris les liens symboliques, les fichiers de caractères et les blocs.

sandeep.s85
la source
Cette réponse a déjà été fournie plus d'un an auparavant par jamzed, (faisant ce bruit visuel.)
Alexx Roche
2

Les solutions "trouver" ci-dessus perdent certaines des capacités de ls - par exemple: lister uniquement les fichiers, triés dans le temps de modification décroissant.

Les réponses "ls -p | grep" ne traitent pas avec élégance d'autres éléments de ls tels que -R s'ils sont souhaités

La réponse ci - dessous, alors que plus bavard, à mon avis , reflète le plus vrai ls comportement et plus de flexibilité pour sélectionner « uniquement les fichiers »

ls -t . | while read line; do
  if [ -f $line ]; then
    echo $line
  fi 
done

Remplacez simplement les commutateurs ls comme vous le souhaitez et le résultat sera retourné avec des fichiers uniquement. Si des liens et d'autres éléments sont également requis, une révision mineure devra être effectuée pour le test d'inclusion.

Pancho
la source
0
ls $(file --no-pad  -F' '  * | grep -v directory | cut -d' ' -f1)

Avec cela, vous pouvez toujours utiliser d'autres options ls. Ou ... supprimer -vpour ne répertorier que les répertoires. Ou ... remplacez le répertoire par tout autre type de fichier qui filecomprend et signale, comme ASCII, vide, ELF, etc.

Kaulbach
la source
Cela ne fonctionne pas si l'un des noms de fichiers à répertorier contient des espaces.
Psychonaut
ls -t .|while read f;do [ -f "$f" ]&& echo $f;doneest environ 3 fois plus rapide dans mes tests
Alexx Roche
0

J'étais sur un système où le findbinaire ne supportait pas -notet j'ai fini par utiliser:

ls|while read f;do [ -f "$f" ]&& echo $f;done

Avantages: ne repose sur rien d'autre que sh ls echo
compatible avec bash et dash
peut être modifié pour correspondre à d'autres choses (comme les répertoires) en changeant -f
est plus rapide que certaines des réponses et utilise moins de RAM et de CPU

Alexx Roche
la source