répertorier les fichiers dans un répertoire sans répertorier les sous-répertoires et leur contenu dans ce répertoire

24

Je veux créer une liste de tous les fichiers dans un répertoire, sans répertorier aucun des sous-répertoires qui résident dans ce même répertoire, et imprimer cette liste dans un nouveau fichier.

ls -d * > filelist

va créer une liste de tous les fichiers du répertoire courant, mais il répertorie également les sous-répertoires du répertoire courant. J'ai essayé la findcommande en utilisant l' -maxdepth 1option - cependant, le format de sortie est un problème car find imprime également le chemin avec les noms de fichiers.

Si quelqu'un peut me dire s'il vous plaît peut-être une autre commande ou des options à utiliser qui produiront une liste de sortie uniquement des fichiers dans un répertoire et non les noms des sous-répertoires ou leur contenu, je l'apprécierais.

Janet
la source
2
Je suis confus ls -d *seulement lister les fichiers et dossiers dans le dossier actuel à l'exclusion des fichiers / dossiers cachés ici;
GM-Script-Writer-62850
oui, mais je ne veux pas que les dossiers de ce répertoire soient listés, je veux seulement que les fichiers de ce répertoire soient listés
janet

Réponses:

22

Solution basée sur la recherche:

find . -maxdepth 1 -type f -printf '%f\n'

Solution basée sur Bash:

for f in *; do [[ -d "$f" ]] || echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -d "$f" ]] || ls -- "$f"; done

La solution bash vous fournira tout ce qui n'est pas un répertoire; cela inclura des choses comme les pipes nommées (vous le voulez probablement). Si vous souhaitez spécifiquement uniquement des fichiers , utilisez la findcommande ou l'une d'entre elles:

for f in *; do [[ -f "$f" ]] && echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -f "$f" ]] && ls -- "$f"; done

Si vous comptez l'utiliser régulièrement, vous pouvez bien sûr le mettre dans un alias quelque part dans votre ~/.bashrc:

alias lsfiles='for f in *; do [[ -f "$f" ]] && ls -- "$f"; done'

Puisque vous avez noté dans les commentaires que vous êtes en fait sur OSX plutôt que sur Ubuntu, je suggérerais que la prochaine fois que vous dirigez des questions vers Apple ou des sites plus généraux Unix et Linux Stack Exchange.

evilsoup
la source
1
Assurez-vous de vérifier que ces solutions vous conviennent, selon que vous souhaitez ou non inclure des fichiers masqués.
Kevin Wheeler du
10

Liste des noms de fichiers uniquement:

1. ls -p | grep -v / (sans fichiers cachés)
 2. ls -l | grep ^ - | tr -s '' | cut -d '' -f 9 (sans fichiers cachés)

 a) ls -pa | grep -v / (avec fichiers cachés)
 b) ls -la | grep ^ - | tr -s '' | cut -d '' -f (avec fichiers cachés)

Répertorier uniquement les répertoires:

1. ls -p | grep / (sans caché)
 2. ls -l | grep ^ d | tr -s '' | cut -d '' -f 9 (sans caché)

 a) ls -pa | grep / (avec caché)
 b) ls -l | grep ^ d | tr -s '' | cut -d '' -f 9 (avec caché)

grep -v -e ^ $ consiste à supprimer les lignes vierges du résultat.

Plus de détails :
ls -p flag est de mettre '/' à la fin du nom du répertoire, -R flag est pour la recherche récursive, -l pour lister avec info, -a pour lister tout (y compris les fichiers cachés) avec info, grep L'indicateur -v correspond à l'inversion des résultats et l'indicateur -e correspond à l'expression régulière.

Ananda
la source
7

Pour répertorier les fichiers normaux uniquement:

ls -al | grep ^-

Avec des liens symboliques inclus:

ls -al | grep ^[-l]

Lorsque le premier caractère de la liste décrit le type de fichier, cela -signifie donc qu'il s'agit d'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

Imprimez les noms de tous les fichiers /etcqui commencent pet finissent par d:

run-parts --list --regex '^p.*d$' /etc
kenorb
la source
5

Encore une autre solution, naïvement courte qui a fonctionné pour moi:

ls -la | grep -E '^[^d]' > files
arsaKasra
la source
parfait pour moi,ls -alR |grep -E '^-'
ici
4

Je suggérerais d'utiliser find et de supprimer le nom du répertoire de la sortie si nécessaire:

find . -type f -maxdepth 1 | sed s,^./,,
Puma
la source
2
-maxdepth 1devrait précéder tous les filtres, et vous pouvez obtenir ce résultat sans utiliser sedl' -printfoption, c'est-à-dire: find . -maxdepth 1 -type f -printf '%f\n'(ce sera plus efficace que d'utiliser un programme supplémentaire).
evilsoup
3
ls -1 --file-type | grep -v '/' | sed s/@$// > filelist

Une autre option possible est

ls -F | grep -v '/' | sed /[@*]$// > filelist

Le --file-typemet un / à la fin des dossiers (mais aussi un @ à la fin des liens symboliques. The grep -v '/'Supprime les sous-répertoires (car ils se terminent maintenant par un '/'). Le sed s/@$//supprime que @. Le -1 imprime un fichier par ligne afin que le grep -v fonctionne correctement.

Dr.Tower
la source
Merci pour votre réponse. malheureusement, cela ne fonctionne pas pour moi, peut-être que je ne l'exécute pas correctement. si j'utilise la commande exacte que vous m'avez donnée, j'obtiens l'erreur suivante: ls: option illégale - - utilisation: ls [-ABCFGHLPRSTWabcdefghiklmnopqrstuwx1] [fichier ...] j'ai essayé d'utiliser le caractère générique * à la place de ainsi que dans en conjonction avec --file-type. si vous pouviez clarifier je l'apprécierais!
janet
La commande fonctionne pour moi (exécutant 13.04), quelle version d'ubuntu utilisez-vous ?; -1n'a pas d'importance pour grep vous n'en avez pas besoin; si vous voulez inclure des fichiers cachés, utilisez l' -aoption onls
GM-Script-Writer-62850
en fait, je travaille sur un mac. peut-être que la commande est légèrement différente sur mac os x ou unix?
janet
1
Vous pouvez également essayerls -F | grep -v '/' | sed s/[@*]$// > filelist
Dr.Tower