Je me rends compte que ce document est très ancien, mais il figurait parmi les premiers résultats de Google lorsque j'ai cherché une solution à un problème similaire, et je vais donc publier ce que j'ai fait ici. Mon scénario est légèrement différent, car je voulais simplement faire exploser un bocal, ainsi que tous les bocaux qu'il contient, et j'ai donc écrit les fonctions bash suivantes :
function explode {
local target="$1"
echo "Exploding $target."
if [ -f "$target" ] ; then
explodeFile "$target"
elif [ -d "$target" ] ; then
while [ "$(find "$target" -type f -regextype posix-egrep -iregex ".*\.(zip|jar|ear|war|sar)")" != "" ] ; do
find "$target" -type f -regextype posix-egrep -iregex ".*\.(zip|jar|ear|war|sar)" -exec bash -c 'source "<file-where-this-function-is-stored>" ; explode "{}"' \;
done
else
echo "Could not find $target."
fi
}
function explodeFile {
local target="$1"
echo "Exploding file $target."
mv "$target" "$target.tmp"
unzip -q "$target.tmp" -d "$target"
rm "$target.tmp"
}
Notez que les <file-where-this-function-is-stored>
ce qui est nécessaire si vous le stockez dans un fichier qui n'est pas lu par un shell non interactif comme c'était mon cas. Si vous stockez les fonctions dans un fichier chargé sur des shells non-interactifs (par exemple, .bashrc
Je crois que vous pouvez laisser tomber l'ensemble source
déclaration. J'espère que cela aidera quelqu'un.
Un petit avertissement - explodeFile
supprime également le fichier zippé, vous pouvez bien sûr changer cela en commentant la dernière ligne.