Concaténation de retour d'une commande en bash

awk
bash
Tags: #<Tag:0x00007f0929da3340> #<Tag:0x00007f0929da3070>

#1

Salut,

Je cherche à concaténer le retour d’une commande afin de pouvoir me faire une liste de vhd à jour.

Le but est de pouvoir lister des vhd sur une répertoire monté en NFS à la demande d’un script effectuant une vérification d’intégrité via l’utilitaire vhd-util (paquet pour les curieux blktap-utils ^^ ).

Lorsque je fais un simple ls du répertoire j’ai un truc comme ça :

/mnt/verif/snapshots/3701/70160:
cdce727e-63e9-479f-a377-cf7e71317848.vhd

/mnt/verif/snapshots/3701/70285:
ac6bfb89-f131-4c8c-8719-8765efd3339c.vhd

/mnt/verif/snapshots/3701/70287:
7bd4e668-47e0-4a2d-8c65-4942cf5ebbd5.vhd

/mnt/verif/snapshots/3701/70327:
c51d621d-f46d-40f4-b845-6dca9bb22217.vhd

/mnt/verif/snapshots/3701/70328:
a23bb5cb-c913-44b8-821b-6d29599d3e0d.vhd

/mnt/verif/snapshots/3701/70329:
3edeabed-507b-4db2-9310-b70f702687e8.vhd

/mnt/verif/snapshots/3701/70330:
44bdc7b8-bcd1-4d0e-b8e5-954ac71671f4.vhd

/mnt/verif/snapshots/3701/70331:
2ce092ca-d168-4e1f-b525-912a2d8d49f5.vhd

La liste est écourté car longue comme ma … :smiley:

à première vue je pourrais supprimer les lignes vide à l’aide de sed ‘/^$/d’ et je devrais pouvoir m’appuyer sur les : pour signaler ma fin de première ligne mais je ne parviens pas à le faire en une fois à l’aide de awk.

y’a t’il une bonne âme pour me montrer la voie ?

Le résultat devrais être du genre :

/mnt/verif/snapshots/3701/70160/cdce727e-63e9-479f-a377-cf7e71317848.vhd
/mnt/verif/snapshots/3701/70285/ac6bfb89-f131-4c8c-8719-8765efd3339c.vhd

le remplacement des : par un 8 se faisant pour l’instant à coup de tr mais je ne dit pas non à un traitement des lignes vides et du remplacement des : directement par awk


#2

Bonsoir Clochette

En lignes de commande bash

La ligne de commandes suivante
va afficher tous les fichiers dont le nom d’extension est .vhd
qui seront trouvés dans le répertoire /mnt/verif/snapshots/3701
et dans tous ses sous-répertoires.

while read; do echo "$REPLY"; done <<< $(find /mnt/verif/snapshots/3701 -name "*.vhd" 2>/dev/null)

il te restera à remplacer
echo "$REPLY"
par ta ligne de commande utilisant vhd-util
sachant que la variable :
REPLY (qui est automatiquement créée par l’utilisation de la commande read)
correspond à :
/mnt/verif/snapshots/3701/unSousRep/nomDuFichiertrouvé.vhd


Ou bien, si tu préfère, toujours en bash
tu peux aussi faire ça en utilisant un tableau
qui contiendrait la liste des fichiers .vhd
qui sera retournée par la commande find :

tablVhds=($(find /mnt/verif/snapshots/3701 -name "*.vhd" 2>/dev/null))
for fichVhd in "${tablVhds[@]}"; do echo "$fichVhd"; done

Bien sûr, tu peux mettre autant de commandes que tu veux entre do et done
voire même envoyer le nom du fichier en paramètre d’une fonction de traitement
ou un vers un autre script.


Tu peux aussi contrôler la profondeur de hiérarchie (niveau de profondeur des sous-répertoires)
de la recherche effectuée par la commande find
en utilisant l’option maxdepth de la commande find

Par exemple, dans la ligne de commande suivante,
find ne recherchera que les fichiers .vhd
qui sont présents dans le répertoire /mnt/verif/snapshots/3701
et PAS dans les sous-répertoires de /mnt/verif/snapshots/3701

find /mnt/verif/snapshots/3701 -maxdepth 1 -name "*.vhd" 2>/dev/null

mais en mettant -maxdepth 2

la recherche se fera dans :
/mnt/verif/snapshots/3701/
/mnt/verif/snapshots/3701/70329

mais PAS dans :
/mnt/verif/snapshots/3701/70329/12345


#3

Eh benh pour le coup le coup du tableau est géniale il me permet de préparer une liste propre et de réutiliser le tableau pour d’autre actions, je le note dans ma petite tête :wink:

Un grand merci.