Accueil > Système > Tree en une ligne de commande (sed)

Tree en une ligne de commande (sed)

26/11/2013 Categories: Système Tags: ,

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.

Print Friendly, PDF & Email

Related Post

Categories: Système Tags: ,
Les commentaires sont fermés.