652 votes

Commande ls : comment puis-je obtenir une liste récursive du chemin complet, une ligne par fichier ?

Comment puis-je faire en sorte que ls produise une liste plate de chemins récursifs d'une ligne à la fois ?

Par exemple, je veux juste une liste plate 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.

3 votes

Voir aussi : árbol

3 votes

Tree -aflix --noreport <path> mais si vous utilisez tree et qu'il y a des liens symboliques dans le chemin, vous devrez les gérer ou utiliser une solution alternative parmi les réponses proposées.

748voto

stefanB Points 27796

Utilisez trouver :

find .
find /home/dreftymac

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

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

2 votes

Peut ls des paramètres comme --sort=extension "racheté" par cette solution ?

1 votes

Vous pouvez même utiliser la sortie printf afin d'afficher les informations contextuelles nécessaires (par exemple, find . -type f -printf '%p %u \n ')

0 votes

Est-ce que cela peut être formaté avec un falg ? par exemple : python pprint.pprint(files)

439voto

ghostdog74 Points 86060

Si vous voulez vraiment utiliser ls puis 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 }'

5 votes

@dreftymac, ce qui signifie que c'est, objectivement parlant, la bonne réponse à la question que vous avez écrite, intentionnellement ou non. Oui, peut-être que ce n'était pas la bonne réponse à la question que vous avez écrite. espéré d'avoir écrit. Et bien que je sois d'accord avec votre remarque générale : "quand le sage montre la lune, le fou regarde le doigt", il n'est que juste que nous minimisions l'impact de la subjectivité pour évaluer la justesse, en particulier lorsque le critère ne comporte aucune ambiguïté possible.

0 votes

@lurscher : puisque stackoverflow ne supporte pas encore l'approbation simultanée de plus d'une réponse, maintenant ghostdog74 obtient la reconnaissance. N'hésitez pas à retransformer votre -1 en +1 si vous le souhaitez.

1 votes

@dreftymac, je serai heureux de changer mon vote, mais il est maintenant verrouillé, vous devez éditer la question pour que je puisse mettre à jour le vote.

92voto

others Points 181

ls -ld $(find .)

si vous voulez trier vos résultats par temps de modification :

ls -ltd $(find .)

16 votes

-bash : /bin/ls : Liste d'arguments trop longue

1 votes

+1 a fonctionné pour moi avec 12106 fichiers, et j'ai pu utiliser la fonction --sort=extension paramètre de ls

6 votes

Merci. Je n'aurais pas pensé par moi-même à cette syntaxe (agréable et courte) - j'aurais utilisé find . -name "*" -exec ls -ld '{}' \; (celle-là fonctionne quel que soit le nombre de fichiers), mais votre commande est bien plus courte à écrire ;)

71voto

kerkael Points 121

La meilleure commande est : tree -fi

-f imprimer le préfixe du chemin complet pour chaque fichier
-i ne pas imprimer les indentations

par exemple

$ tree -fi
.
./README.md
./node_modules
./package.json
./src
./src/datasources
./src/datasources/bookmarks.js
./src/example.json
./src/index.js
./src/resolvers.js
./src/schema.js

Afin d'utiliser les fichiers mais pas les liens, vous devez enlever > de votre sortie :

tree -fi |grep -v \>

Si vous voulez connaître la nature de chaque fichier, (pour ne lire que les fichiers ASCII par exemple) essayez un while boucle :

tree -fi |
grep -v \> |
while read -r first ; do 
    file "${first}"
done |
grep ASCII

0 votes

Merci, je ne savais pas que tree !

0 votes

@Nakilon Quelle est la chose la plus proche ? Affiche-t-il les résultats de manière similaire ? Comment feriez-vous facilement afficher une sortie similaire avec un court commande ?

7 votes

@om01 : sur osx c'est un difficile comme brew install tree étant donné que vous utilisez homebrew

62voto

Ivan Alegre Points 151

Essayez la méthode plus simple suivante :

find "$PWD"

11 votes

find "`pwd`" si le chemin d'accès contient des espaces ou d'autres caractères spéciaux.

9 votes

En quoi est-ce différent de find . ? -.-

9 votes

@SalmanPK Si vous donnez trouver un chemin absolu comme pwd pour commencer, il imprimera les chemins absolus. Au fait, "En quoi cela est-il différent de find " ;-)

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