Une Linux commande un peu « space ».

Elle m'a été passée par un ami, sans un mot d'explication.
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).

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 :

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

Cela m’a permis de me replonger dans SED.


Written on janvier 16th, 2011 & filed under Linux Tags:
LEAVE A COMMENT
Comment

 
COMMENTS
    max commented

    merci pour la cmd ‘tree’ qui m’a permis
    de repérer et d’effacer de nombreux fichiers inutiles
    (dont phpmyadmin) qui ne me sert à rien

    13 mars 2011 at 7:21
    didieradmin commented

    Content que ça te soit utile ;-)

    Moi j’avais voulu comprendre comment ça fonctionnait … j’ai appris des choses aussi.

    30 mars 2011 at 0:25

    [...] Tree en une ligne de commande (sed) 27/10/2011 DBsysNet Commenter Allez aux commentaires   Source: didier.misson.net [...]

    24 mars 2012 at 19:15