Le retour du techos !
Par Contributeur - Publié le
Pour commencer permettez moi de présenter à ceux qui ne la connaissent pas une commande fort utile pour la programmation shell: dirname. Cette commande renvoie le chemin d'accès du dossier dans lequel est situé son argument. Attention toutefois, ce programme ne cherche nullement à vérifier l'existence réelle du fichier, elle ne fait que manipuler le chemin d'accès qui lui est fourni.
Exemple:
dirname /Users/toto/test/essai/tentative.sh
/Users/toto/test/essai
Je vais maintenant vous proposer un moyen d'arriver au même résultat grâce à awk.
Essayez donc la commande echo "/Users/toto/test/essai/tentative.sh" | awk 'BEGIN {FS="/"; OFS="/"}; {NF--; print $0}'.
Le principe est simple: on définit d'abord le charactère délimiteur de champs (FS="/") et le délimiteur de champs en sortie (OFS="/"). Puis pour chaque ligne que awk aura à traiter (bien évidemment ici il n'y en a qu'une), on supprime le dernier champ et on affiche ce qui reste.
Cette commande pourrait être améliorée par l'ajout d'un test: en effet si l'argument est un dossier elle ne fait pas la différence et efface le dernier composant.
Pour finir déterminons laquelle des deux méthodes est la plus rapide. Un simple comparatif mené par les bons soins de l'utilitaire time montre que dirname est plus rapide que notre commande artisanale, ce qui montre uen nouvelle fois que les programmes écrits en C sont plus performants que des commandes shell construites à partir d'autres commandes.
Exemple:
dirname /Users/toto/test/essai/tentative.sh
/Users/toto/test/essai
Je vais maintenant vous proposer un moyen d'arriver au même résultat grâce à awk.
Essayez donc la commande echo "/Users/toto/test/essai/tentative.sh" | awk 'BEGIN {FS="/"; OFS="/"}; {NF--; print $0}'.
Le principe est simple: on définit d'abord le charactère délimiteur de champs (FS="/") et le délimiteur de champs en sortie (OFS="/"). Puis pour chaque ligne que awk aura à traiter (bien évidemment ici il n'y en a qu'une), on supprime le dernier champ et on affiche ce qui reste.
Cette commande pourrait être améliorée par l'ajout d'un test: en effet si l'argument est un dossier elle ne fait pas la différence et efface le dernier composant.
Pour finir déterminons laquelle des deux méthodes est la plus rapide. Un simple comparatif mené par les bons soins de l'utilitaire time montre que dirname est plus rapide que notre commande artisanale, ce qui montre uen nouvelle fois que les programmes écrits en C sont plus performants que des commandes shell construites à partir d'autres commandes.