Usuários do Slackware sabem o quanto o utilitário removepkg é lento para remover pacotes instalados. Os motivos para isso são que, além de o utilitário ser escrito em Shell Script, ele faz testes e mais testes antes de começar a remover os arquivos, o que torna o processo seguro, porém muito lento.
Recentemente tentei atualizar o meu FreeRock GNOME 2.14 para o Dropline GNOME 2.16. A atualização demorou muito e, ao final, a instalação ficou quebrada. Não estava com tempo disponível para ficar tentando consertar as coisas, então resolvi remover todos os pacotes do GNOME e reinstalar o FreeRock, que estava funcionando perfeitamente.
O problema era que, somando-se os pacotes do FreeRock e do Dropline, dava um total de mais de 300 pacotes que precisavam ser removidos, o que iria demorar um dia inteiro caso eu usasse o removepkg, tempo que eu não tinha, pois precisava ter um desktop funcionando dentro de poucos minutos.
Assim desenvolvi uma solução alternativa de emergência (a popular gambiarra), que resolveu o meu problema e que apresento a vocês agora, por achar que pode vir a ser muito útil.
Crie um script chamado remove.sh com o seguinte conteúdo:
#!/bin/sh
# remove.sh
# Script para remover rapidamente pacotes no Slackware
#
# Autor: Davidson Paulo <davidsonpaulo@gmail.com>
# Uso: sh remove.sh [pacote] [ backup ]
# Testa se está tudo OK para o script ser executado
if [ "$PWD" != "/var/log/packages" ] ; then
echo "Esse script precisa ser executado dentro de /var/log/packages"
exit 1
fi
case $# in
1)
if [ ! -f $1 ] ; then
echo "Erro: arquivo $1 não existe. Informe um arquivo válido"
exit 3
else
BACKUP=0
fi
;;
2)
if [ "$2" != "backup" ] ; then
echo "Erro: parâmetro incorreto: $2"
exit 4
else
BACKUP=1
fi
;;
*)
echo "Uso: $0 [pacote] [ backup ]"
exit 2
;;
esac
# Inicia a remoção do pacote
echo -ne "Removendo pacote $1...\t\t\t"
for FILE in `tail +17 $1|sort -r` ; do
if [ -f /$FILE ] ; then
# Faz o backup, se assim for solicitado
if [ $BACKUP -eq 1 ] ; then
tar uf /tmp/$1.tar /$FILE &> /dev/null
fi
rm /$FILE
elif [ -d /$FILE ] ; then
if ! ls /$FILE > /dev/null ; then
rmdir /$FILE
fi
fi
done
# Finaliza o backup, se assim tiver sido solicitado
if [ $BACKUP -eq 1 ] ; then
# Salva o script de instalação
mkdir /install
mv /var/log/scripts/$1 /install/doinst.sh
chmod 644 /install/doinst.sh
# Salva o arquivo de descrição
tail +6 $1 | head -n 11 > /install/slack-desc
# Adiciona o diretório /install ao pacote .tar e
# remove o diretório
tar uf /tmp/$1.tar /install &> /dev/null
rm -r /install
# Compacta o pacote e renomeia-o para .tgz
gzip -9 /tmp/$1.tar
mv /tmp/$1{.tar.gz,.tgz}
fi
# Remove o arquivo com a lista de arquivos do pacote
rm $1
echo "[ OK ]"
Salve esse script no diretório /var/log/packages. Para remover um pacote, basta acessar o diretório e executar o script, passando como parâmetro o nome do pacote (deve existir um arquivo com esse nome dentro do diretório /var/log/packages):
# cd /var/log/packages
# sh remove.sh [pacote]
Para remover, por exemplo, o pacote gedit-2.14.3-i486-1frg, use:
# sh remove.sh gedit-2.14.3-i486-1frg
Você pode optar por fazer um backup do pacote, para que você possa reinstalá-lo caso algo dê errado. Para isso, basta adicionar a opção backup:
# sh remove.sh gedit-2.14.3-i486-1frg backup
Nesse exemplo, será feito um backup dos arquivos excluídos (incluído slack-desc e doinst.sh) em /tmp/gedit-2.14.3-i486-1frg..tgz. Case algo dê errado, você poderá reinstalar o pacote removido sem dificuldade:
# installpkg /tmp/gedit-2.14.3-i486-1frg.tgz
Se você fizer backup o processo de remoção vai demorar bem mais, mas ainda assim vai levar bem menos tempo que removepkg.
Se você quiser remover arquivos em lote, há vários meios. No meu caso, eu precisei remover todos os pacotes do FreeRock e do Dropline. Como os nomes desses pacotes terminavam em 'frg' e 'dl', respectivamente, bastou fazer assim:
# for PACOTE in *dl *frg ; do
sh remove.sh $PACOTE
done
Você pode criar um arquivo chamado 'lista', por exemplo, contendo os nomes dos pacotes que você quer remover, e então fazer assim:
# for PACOTE in `cat lista` ; do
sh remove.sh $PACOTE
done
Essa é uma boa alternativa para remover pacotes no Slackware, desde que não se tenha que fazer nenhuma verificação mais complexa ou se pretenda usar algum recurso avançado do removepkg.
Apenas para fins de alerta: esse script não possui qualquer tipo de garantia por parte do autor. Use-o por sua conta e risco. Ele está disponível sob a licença GNU GPL, então você é livre para copiá-lo, modificá-lo e distribuindo livremente, desde que respeite os termos da licença.
Espero que possa ser útil.
Grande abraço,
Davidson Paulo