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.
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.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
...