Tree en une ligne de commande (sed)
Source: didier.misson.net
Mais que fait cette commande ?
Il suffit d’essayer en ligne de commande…
Non, ce n’est pas risqué.
ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'
Cette commande liste vos dossiers en arborescence, sous forme d’un arbre.
C’est plutôt pour le fun, et pour utiliser SED, car on ne va pas retaper cette longue commande à chaque fois !
Voyez donc ce billet comme un exercice, un exemple de ce qu’on peut faire en ligne de commande avec SED, et pas comme un « truc et astuce ».
J’ai ensuite voulu comprendre comment cette commande fonctionnait.
On y retrouve des commandes assez classiques en Linux : ls, grep et sed.
On va décortiquer :
ls -R : list récursif … oui ok, c’est pas une option que j’utilise tous les jours
Des « pipe » « | » qui passent le résultat à la commande suivante oui.
Combiné au « grep « :$ » ça donne la liste des directorys, recursif, sans les fichiers
(on ne sélectionne que les lignes terminées par « : » , le $ étant la fin de ligne)
.: ./backup: ./download: ./drush: ./drush/commands: ./drush/commands/core: ./drush/commands/core/drupal: ./drush/commands/pm: ./drush/commands/pm/package_handler: ./drush/commands/pm/update_info: ./drush/commands/pm/version_control: ./drush/commands/sql: ./drush/commands/user: ./drush/docs: ./drush/examples: ./drush/includes: ./scripts:
sed editor ! Celui là, je l’ai rarement utilisé.
sed -e 's/:$//'</pre>
s est la commande substitute (remplacement).
Le caractère de séparation est le « / » qui suit la commande.
‘s/:$ fait une substitution du « : » en fin de ligne (justement sélectionné par le grep précédant), remplacé par rien (2 // qui se suivent sans rien entre les 2)
ce qui donne ceci :
. ./backup ./download ./drush ./drush/commands ./drush/commands/core ./drush/commands/core/drupal ./drush/commands/pm ./drush/commands/pm/package_handler ./drush/commands/pm/update_info ./drush/commands/pm/version_control ./drush/commands/sql ./drush/commands/user ./drush/docs ./drush/examples ./drush/includes ./scripts
(sans le : en fin de ligne)
ensuite, on continue l’édition du résultat :
-e 's/[^-][^\/]*\//--/g'
p… ce ne sont PAS des « V » mais des » \ / » !!!!!
La commande gagnerait en lisibilité en changeant le caractère de substitution.
Alors pas besoin du caractère spécial « \ » pour prendre le « / ».
Je changerais :
-e 's/[^-][^\/]*\//--/g'
en :
-e 's![^-][^/]*/!--!g'
C’est un change global (g = autant de fois qu’il faut).
- « ^ » est un symbole correspondant au début de ligne (ou de groupe de caractères).
- « * » signifie un ou plusieurs caractères comme celui qui précède
On remplace donc tous les groupes de caractères qui commencent par des « – » ou des « / » (une ou plusieurs fois) et qui se terminant par « / », par « – »
Logique, il y a bien un double « – » pour chaque niveau de sous-dossier.
c’est un remplacement « global » (le /g) qui permet de remplacer quelque soit la profondeur des sous-dossiers.
Le nom du dernier sous-dossier n’est jamais remplacé car il n’est pas suivit par « / »
exemple :
« drush » reste « drush car il n’est pas terminé par « / »
« drush/commands » devient « –/commands »
« drush/commands/core » devient « —-/core »
« drush/commands/core/drupal » devient « ——/drupal »
On obtient :
. --backup --download --drush ----commands ------core --------drupal ------pm --------package_handler --------update_info --------version_control ------sql ------user ----docs ----examples ----includes --scripts
le -e ‘s/^/ /’ fait UN remplacement de « ^ » (début de ligne) par un blanc, c’est-à-dire que ça ajoute un espacement en début de ligne.
On obtient :
. --backup --download --drush ----commands ------core --------drupal ------pm --------package_handler --------update_info --------version_control ------sql ------user ----docs ----examples ----includes --scripts
Le dernier -e ‘s/-/|/’ fait juste UN remplacement d’un « – » par « | », ce qui fait la barre de début de ligne pour bien présenter l’arborescence :
oem@ubuntu-oem:~$ ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/' . |-backup |-download |-drush |---commands |-----core |-------drupal |-----pm |-------package_handler |-------update_info |-------version_control |-----sql |-----user |---docs |---examples |---includes |-scripts
Voilà…
Finalement, c’était SIMPLE… mais pas optimum !
Moi j’aurais remplacé :
ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'
par
ls -R | grep ":$" | sed -e 's/:$//' -e 's![^-][^/]*/!--!g' -e 's/^/ /' -e 's/-/|/'
Maintenant, pour un usage courant, la commande « tree » existe en Debian et Ubuntu, mais n’est pas installée d’origine.
Il suffit de l’installer :
apt-get install tree
tree -sh
Et voilà, et en plus c’est en couleur 😉
Merci à Cédric Paulin pour cette commande originale à décortiquer et comprendre.