Я понимаю, что это очень давно, но это был один из первых обращений в Google, когда я искал решение для чего-то подобного, поэтому я опубликую то, что я сделал здесь. Мой сценарий немного отличается, так как я просто хотел полностью разобрать банку вместе со всеми банками, содержащимися в ней, поэтому я написал следующие функции bash:
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"
}
Обратите внимание на <file-where-this-function-is-stored>
, который необходим, если вы сохраняете это в файле, который не читается для неинтерактивной оболочки, как это случилось у меня. Если вы храните функции в файле, загруженном в неинтерактивные оболочки (например, .bashrc
, я полагаю), вы можете отбросить весь оператор source
. Надеюсь, это кому-нибудь поможет.
Небольшое предупреждение - explodeFile
также удаляет заархивированный файл, вы, конечно, можете изменить это, закомментировав последнюю строку.