2010-11-30 10 views
6

Hé les gars, j'ai des problèmes avec le passage de la variable à% exe partie du code. Besoin de votre aide.Comment passer une variable dans find et bash -c?

Voici mon code de travail que j'utiliser à l'intérieur script bash:

## Function 
targz() { 
    find $1 -type f -name "*.$2" -exec \ 
    bash -c 'old=$(basename {}); new=${old/%exe/tar\.gz}; \ 
     tar -zcvf $new $old; ' \; 
} 

## Function Call 
## targz [directory] [extension] 
targz . 'exe'; 

et oui je l'ai essayé de l'utiliser quelque chose comme ceci:

new=${old/%$2/tar\.gz}; 

mais il génère des noms comme: fichier .exetar.gz

Répondre

5

Essayez:

targz() { 
    find $1 -type f -name "*.$2" -exec \ 
    bash -c 'old=$(basename {}); new=${old/'"$2"'/tar\.gz}; \ 
     tar -zcvf $new $old; ' \; 
} 

L'astuce est de sortir de la citation unique, de sorte que l'expansion variable sera effectuée.

+0

Merci Darron, c'est exactement ce dont j'avais besoin. – EMC

4

Utilisez env pour définir une variable d'environnement pour bash:

targz() { 
    find "$1" -type f -name "*.$2" -exec \ 
    env ext="$2" bash -c 'old=$(basename "{}"); new=${old/%$ext/tar\.gz}; \ 
     tar -zcvf "$new" "$old"; ' \; 
} 

J'ai ajouté des guillemets pour protéger contre les espaces dans les noms de fichiers.

+0

Merci Dennis, j'ai appliqué les guillemets autour de {} – EMC

+0

Nice; Il vaut également la peine de citer deux fois «$ 1» et «$ 2». – mklement0

+1

@ mklement0: Terminé. Merci. –