web-dev-qa-db-fra.com

Imprimer une liste de chemins relatifs "complets" de tous les fichiers présents dans un répertoire et dans ses sous-répertoires

J'ai besoin d'imprimer une liste de chemins relatifs "complets" de tous les fichiers présents dans un répertoire et dans ses sous-répertoires. Je faisais ça avec du et grep:

du -a <path_to_directory> | grep -Po '[0-9]+\t\/\K.*'

Mais du remplace une partie des chemins par des points s'ils sont trop longs.

Quelle est une bonne alternative?

l'analyse de ls n'est pas une option.

5
kos

L’option la plus simple serait find :

$ cd /usr/lib; find .
.
./libxcb-icccm.so.4.0.0
./libbz2.so.1.0.6
./libdca.so.0
./libxcb-composite.so
./libyajl.so
./libswscale.so
./libxvidcore.so.4.3
./libjasper.so.1
./libdrm_intel.so.1
...

Il dispose de divers tests de filtrage tels que:

  • -type pour filtrer en fonction du type (fichier normal f, répertoire d, etc.)
  • -mindepth et -maxdepth pour définir les profondeurs dans lesquelles find doit effectuer une recherche (pas vraiment de test en tant que tel)
  • -name et -path pour filtrer en fonction du nom de fichier et du chemin d'accès, prenant en charge les caractères génériques.
  • et beaucoup d'autres tests, pour les permissions, la propriété, les temps, etc.

Il offre une variété de formats de sortie, en utilisant l'option -printf.


En fonction du shell et des options activées, vous pouvez également utiliser la fonction de regroupement à cette fin. Par exemple, dans bash:

$ shopt -s globstar; printf "%s\n" **
accountsservice
accountsservice/accounts-daemon
aisleriot
aisleriot/ar-cards-renderer
aisleriot/guile
aisleriot/guile/2.0
aisleriot/guile/2.0/accordion.go
aisleriot/guile/2.0/agnes.go
aisleriot/guile/2.0/aisleriot
aisleriot/guile/2.0/aisleriot/api.go
...

Et dans zsh:

$ printf "%s\n" **/*
accountsservice
accountsservice/accounts-daemon
aisleriot
aisleriot/ar-cards-renderer
aisleriot/guile
aisleriot/guile/2.0
aisleriot/guile/2.0/accordion.go
aisleriot/guile/2.0/agnes.go
aisleriot/guile/2.0/aisleriot
aisleriot/guile/2.0/aisleriot/api.go
...
9
muru