2010-11-24 14 views
1

Salutations,Cette fonction bash peut-elle être optimisée?

J'ai un script bash qui analyse les fichiers ZIP que nous recevons d'un client et les décompresse si un ensemble de critères est reconnu. Ça marche bien mais c'est lent. En particulier, la fonction suivante:

function getCTLfile() { 
    for i in ${HDD_LIST_Array[@]} 
    do 
     if [[ `echo ${i}|awk -F . '{print $NF}'` == "ctl" ]] 
     then 
      echo "${i}" 
     fi 
    done 
} 

but de cette fonction est d'obtenir le nom du fichier de contrôle contenu dans un fichier ZIP. HDD_LIST_Array[@] est obtenu thusly pour chaque fichier zip:

HDD_LIST_Array=(`unzip -l $name | head -n -2|tail -n +4 | sort -r | awk '{print $4}'`) 

Encore une fois, cela fonctionne, bien que lentement. Cette fonction peut-elle être optimisée pour fonctionner plus vite? Aucun conseil?

Merci.

+0

pouvez-vous nous donner un exemple de la sortie de unzip -1 pour vos fichiers zip, et la sortie de getCTLfile –

+0

décompressez sortie === >> CTCA_HDD_20101108_150000.ctl 029045871901 ~ Seagate ~ 20101108 ~ 140021.HDD 028919111311 ~ WD ~ 20101108 ~ 140025.HDD ... – Chris

+0

sortie getCTLfile === >> est Suffixe: ctl. – Chris

Répondre

3

unzip -l prend un modèle de fichier à faire correspondre après le nom de fichier d'entrée, et renvoie 0 en le trouvant ou 11 en cas d'échec.

entry=$(unzip -l -qq "$name" '*.ctl') 
if [ $? -eq 0 ] 
then 
    awk '{ print $4 }' <<< "$entry" 
done 
+0

Wow. Votre approche est beaucoup plus efficace que la mienne ... Merci pour votre contribution. – Chris

+3

@Chris: Vous n'avez même pas à impliquer AWK: changer la première ligne ci-dessus à 'si entrée = ($ (unzip -l -qq" $ name "'* .ctl'))', supprimer la deuxième ligne et change la (quatrième) quatrième ligne en 'printf"% s \ n "$ {entrée [3]}'. Notez que faire des affectations dans les instructions conditionnelles est mal vu - vous pourriez les faire séparément, cependant, et encore profiter de l'utilisation du tableau au lieu de AWK. –

+0

@Dennis: Je suis autodidacte. Pourriez-vous s'il vous plait expliquer ce que l'affectation dans les déclarations conditionnelles est désapprouvée? – Chris

0

Vous pouvez utiliser cut au lieu de awk et && au lieu de if mais qui est probablement mineure si quoi que ce soit. Je suppose que votre plus grande horloge murale est l'IO sur le unzip, oui?

Mettez une commande time autour de l'appel entier et préfixée unzip pour obtenir vos% de différences. AUTRE: Apparemment, vous voulez juste rechercher et imprimer pour tous les fichiers qui se terminent par *.ctl ou quelque chose comme ça dans une fenêtre de ligne (head | tail)? Pouvez-vous plutôt juste grep ou sed de votre sortie unzip? Je parie qu'un script unzip -l |awk suffira. Je mettrai à jour la réponse car vous fournissez plus de détails.

+0

Correct. La décompression est ce qui prend le plus d'IO ... Je verrai à utiliser plutôt grep. – Chris

0

Juste un petit commentaire pour compléter la réponse de mobrule.

Le signe '-' apparaît dans les lignes non désirées. Vous avez besoin de deux caractères pour différencier, peut-être un ':', ou egrep '- [0-9]'