web-dev-qa-db-fra.com

Commande ls: comment obtenir une liste récursive avec un chemin complet, une ligne par fichier?

Comment puis-je obtenir une liste non exhaustive de chemins récursifs d'une ligne par ligne?

Par exemple, je veux juste une liste à plat des fichiers avec leurs chemins complets:

/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow
/home/dreftymac/stackoverflow/alpha.txt
/home/dreftymac/stackoverflow/bravo.txt
/home/dreftymac/stackoverflow/charlie.txt

ls -a1 fait presque ce dont j'ai besoin, mais je ne veux pas de fragments de chemin, je veux des chemins complets.

420
dreftymac

Si vous voulez vraiment utiliser ls, alors formatez sa sortie en utilisant awk:

ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'
343
ghostdog74

Utilisez find:

find .
find /home/dreftymac

Si vous voulez uniquement des fichiers (omettez les répertoires, les périphériques, etc.):

find . -type f
find /home/dreftymac -type f
496
stefanB

ls -ld $(find .)

si vous souhaitez trier votre sortie par date de modification:

ls -ltd $(find .)

70
others

Essayez la méthode la plus simple suivante:

find "$PWD"
50
Ivan Alegre

La meilleure commande est: tree -fi

Pour utiliser les fichiers mais pas les liens, vous devez supprimer > de votre sortie:

tree -fi |grep -v \>

Si vous voulez connaître la nature de chaque fichier, (pour lire uniquement les fichiers ASCII par exemple) avec deux whilename__s:

tree -fi | \
grep -v \> | \
while read first ; do 
    file ${first}
done | \
while read second; do 
    echo ${second} | grep ASCII
done
38
kerkael

Oh, vraiment une longue liste de réponses. Cela m'a beaucoup aidé et finalement, j'ai créé le mien que je cherchais:

Pour répertorier tous les fichiers d’un répertoire et de ses sous-répertoires:

find "$PWD" -type f

Pour répertorier tous les répertoires d'un répertoire et de ses sous-répertoires:

find "$PWD" -type d

Pour répertorier tous les répertoires et fichiers d’un répertoire et de ses sous-répertoires:

find "$PWD"
33
Godfather

Je ne connais pas le chemin complet, mais vous pouvez utiliser -R pour la récursion. Alternativement, si vous n'êtes pas concentré sur lsname__, vous pouvez simplement faire find *.

17
Justin Johnson

En n'utilisant aucune commande externe autre que ls:

ls -R1 /path | 
  while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done
14
Idelic
du -a

Pratique pour certaines coquilles d'appareils limitées où trouver/localiser ne sont pas disponibles.

13
Rob D

trouver/fera l'affaire

12
Dmitry

Je pense que pour une liste plate, le meilleur moyen est:

find -D tree /fullpath/to-dir/ 

(ou pour l'enregistrer dans un fichier txt)

find -D tree /fullpath/to-dir/ > file.txt
9
Dimitrios

Le moyen le plus simple pour tous vos futurs citoyens est tout simplement:

du

Cependant, cela montre aussi la taille de ce qui est contenu dans chaque dossier. Vous pouvez utiliser awk pour sortir uniquement le nom du dossier:

du | awk '{print $2}'

Edit- Désolé, désolé, mon mauvais. Je pensais que seuls les dossiers étaient nécessaires. Je vais laisser ça ici au cas où quelqu'un à l'avenir en aurait besoin de toute façon ...

8
6112115

Avec la liberté d'utiliser toutes les options possibles de ls:

find -type f | xargs ls -1

7
Grzegorz Luczywo

Ne compliquez pas les choses. Je viens de l'utiliser et j'ai une belle sortie:

ls -lR /path/I/need
7
KellyC

Voici une réponse partielle qui montre les noms de répertoire.

ls -mR * | sed -n 's/://p'

Explication:

ls -mR * liste les noms de répertoires complets se terminant par un ':', puis répertorie les fichiers de ce répertoire séparément

sed -n 's/://p' trouve les lignes qui se terminent par un deux-points, élimine les deux points et les affiche

En parcourant la liste des répertoires, nous devrions également pouvoir les trouver. J'y travaille encore. C'est un défi d'obtenir les jokers par xargs.

6
Kevin

Exécutez une commande bash au format suivant:

find /path -type f -exec ls -l \{\} \;
6
Denio Mariz

L'ajout d'un caractère générique à la fin d'un répertoire ls force les chemins d'accès complets. En ce moment vous avez ceci:

$ ls /home/dreftymac/
foo.txt
bar.txt
stackoverflow
stackoverflow/alpha.txt
stackoverflow/bravo.txt
stackoverflow/charlie.txt

Vous pouvez le faire à la place:

$ ls /home/dreftymac/*
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow:
alpha.txt
bravo.txt
charlie.txt

Malheureusement, cela n'imprime pas le chemin complet des répertoires récursifs, il se peut donc que ce ne soit pas la solution complète que vous recherchez.

5
koeselitz

ls -lR est ce que vous cherchiez, ou du moins je l'étais. à votre santé

5
sivi

Je vois beaucoup de réponses. Ceci est le mien, et je pense très utile si vous travaillez sur Mac.

Je suis sûr que vous savez qu'il existe des fichiers "groupés" (. App, . Rtfd, . Workflow, etc.). Et en regardant dans la fenêtre du Finder, ils semblent être des fichiers uniques. Mais ils ne sont pas. Et $ ls ou $ find les voir comme des répertoires ... Donc, à moins que vous ayez besoin de lister leur contenu également, cela fonctionne pour moi:

find . -not -name ".*" -not -name "." | egrep -v "\.rtfd/|\.app/|\.lpdf/|\.workflow/"

Bien sûr, cela s’applique au répertoire de travail, et vous pouvez ajouter les extensions d’autres bundles (mais toujours avec un / après celles-ci). Ou toute autre extension si ce n'est pas un paquet sans le /.

Plutôt intéressant le ".lpdf/" (pdf multilingue). Il a une extension ".pdf" normale (!!) ou aucune dans le Finder. De cette façon, vous obtenez (ou il ne compte qu'un fichier) pour ce pdf et pas un tas de choses…

4
Steve

Si le répertoire est passé en tant que chemin relatif et vous devrez le convertir en chemin absolu avant d'appeler find. Dans l'exemple suivant, le répertoire est passé en tant que premier paramètre au script:

#!/bin/bash

# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory
3
John Keyes
tar cf - $PWD|tar tvf -             

C'est lent mais fonctionne de manière récursive et imprime les répertoires et les fichiers. Vous pouvez le diriger avec awk/grep si vous voulez juste les noms de fichiers sans tous les autres répertoires info /:

tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"          
3
RuleB

@ ghostdog74: Little Tweak avec votre solution.
Le code suivant peut être utilisé pour rechercher un fichier avec son chemin absolu complet.

Sudo ls -R / | awk '<br/>
/:$/&&f{s=$0;f=0}<br/>
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}<br/>
NF&&f{ print s"/"$0 }' | grep [file_to_search]
2
Chaitanya

Je connaissais le nom du fichier, mais je voulais aussi le répertoire.

trouver $ PWD | nom de fichier fgrep

fonctionnait parfaitement sous Mac OS 10.12.1

1
hpj