Mythus vou te contar um segredo, e não conta para ninguém. Eu estou com a rotina pronta a vários dias e com preguiça de testar... fiz alguns testes hoje, acho que tirei a maioria dos bug's (maioria porque esta dando erro para arquivos contendo espaço no seu nome).
Bem, a rotina esta enorme, até porque existem mais comentários do que linhas propriamente ditas, mas eu acho os comentários essenciais, então vai com eles mesmo. Ajuda ai, roda ela e testa os bug's pra mim.
remove_seguro.sh
#!/bin/bash
#
# Remoção segura de arquivos.
# Na verdade não remove, apenas move para a pasta .trash do usuário
#
# Criado por: Cristiano
# Data: 21/08/2007
#
# Alterações:
# Tirado Limitação para Diretórios Dica: Mythus Implementado por: Cristiano - 22/08/2007
# Verificar se arquivo começa com "-" ou é opção Dica: Mythus Implementado por: Cristiano - 22/08/2007
# Encerrando p/ arquivos de outras partições Dica: Mythus Implementado por: Cristiano - 22/08/2007
# Solicitando confirmação para rm da Trash Dica: Mythus Implementado por: Cristiano - 22/08/2007
# Controle de diretórios e arq. em partição Dica: Mythus Implementado por: Cristiano - 22/08/2007
# Controle de lixeiras .Trash-$USER Dica: Mythus Implementado por: Cristiano - 22/08/2007
# Controle para partição=/home e <> raiz (/) Dica: Cristiano Implementado por: Cristiano - 25/08/2007
# Adicionando opções ao mv p/ aumentar segurança Dica: Mythus Implementado por: Cristiano - 25/08/2007
# Movendo arquivos para Lixeiras em cada Partição Dica: Mythus Implementado por: Cristiano - 26/08/2007
#
test "$*" = "" && exit
###########################################################
#Esta variável deve ser alterada para a situação de cada
#usuário que for rodar o script
###########################################################
PATH_Script="/home/clcampos/Scripts"
###########################################################
arquivos=$* # Parametros passados pela linha de comando
arq_a_rm="" # Variável criada para tirar arquivos (que já estão na lixeira) da lista de parametros iniciais
# (pois são removidos automáticamente e não enviados a lixeira)
lixeiraDestino="" # Uma ocorrência para cada arquivo indicado na linha de comando. Variável criada porque a Lixeira poderá ser
# .Trash ou .Trash-user
#####################################################
# Definição da forma de trabalho da rotina quanto a
# Arquivos em outras Partições
# Diretórios
#
eh_dir="0" # 0: Remove sem perguntar 1: Não remove 2: Pergunta primeiro
eh_par="0" # 0: Remove sem perguntar 1: Não remove 2: Pergunta primeiro
#######################################################################################
# Consiste a possibilidade de remoção do arquivo
#
for arquivo in $arquivos;do
opcao=`echo $arquivo | cut -c1-1`
# Se for alguma opção (começado com "-") executa diretamente o comando rm
if test "$opcao" = "-"; then
test -w $arquivo && continue # se existir o tal arquivo começado com "-" então esta tudo ok, senão deve ser parametro
test -d $arquivo && continue # diretório também pode começar com "-"
echo -e "\033[1mrm:\033[0m Rotina executada com opções. Comando \033[1mrm\033[0m será executado."
/bin/rm $arquivos
exit $? #termina a rotina com o mesmo status de término do comando rm, para consistências caso necessário
fi
# Arquivos que estiverem na lixeira serão removidos
diretorio=`dirname $arquivo`
diretorio=`basename $diretorio`
if test "$diretorio" = ".Trash" -o "$diretorio" = ".Trash-$USER"; then
opSN=""
echo -e "\n\nConfima remoção \033[1mdefinitiva\033[0m do item \033[1m$arquivo\033[0m que se encontra na lixeira (s/N)? \c"
read opSN
[[ $opSN = [Ss] ]] && rm $arquivo && continue
else
# Armazena os nomes dos arquivos que serão removidos no próximo for
# Esta sendo usada para que os arquivos que forem da lixeira não estejam na lista visto que
# Ou são removidos aqui
# Ou o usuário desistiu da sua remoção, clicando qualquer coisa diferente de S ou s na pergunta acima
#
arq_a_rm="$arq_a_rm $arquivo"
fi
# Verifica Partição
sh $PATH_Script\/eh_particao.sh $arquivo
if test $? -eq 0; then
if test "$eh_par" = "2";then # Pede confirmação para mover o arquivo para lixeira
opSN=""
echo -e "\n\nO alvo (\033[1m$arquivo\033[0m) encontra-se em uma outra partição. Deseja mesmo movê-lo para lixeira (s/N)? \c"
read opSN
[[ $opSN = [Ss] ]] || echo -e "\033[1mrm:\033[0m Nada foi feito."
[[ $opSN = [Ss] ]] || exit 9999
elif test "$eh_par" = "1";then #Não libera a "remoção"
echo -e "\033[1mrm:\033[0m Impossível remover \"\033[1m$arquivo\033[0m\": Em outra partição."
exit 9999
fi
#####################################################################
# Neste ponto ja se sabe que o arquivo é da partição (não raiz), ai
# define-se que a lixeira dele será /partição/.Trash-$USER
#
nm_part=`sh $PATH_Script\/eh_particao.sh $arquivo "true"`
test "$nm_part" = "" && echo -e "\033[1mrm\033[0m: Nada será feito. Partição não definida." && exit 9999 # apenas uma garantia
if test `echo $nm_part | cut -f2 -d"/"` = "home";then
test "$nm_part" != "" && lixeiraDestino="$lixeiraDestino $nm_part/.Trash" # Para partição em home lixeira = .Trash
else
test "$nm_part" != "" && lixeiraDestino="$lixeiraDestino $nm_part/.Trash-$USER" # Para partição em home lixeira = .Trash-$USER
fi
# Teste se partição permite escrita
#
ntentativa=1
while true; do
# apenas um cuidado de não perder nada, por mais que este arquivo não deva mesmo existir
test -d "testando_escrita$ntentativa" -o -f "testando_escrita$ntentativa" && ntentativa=`expr $ntentativa + 1` && continue
echo "teste de escrita" > $nm_part/testando_escrita$ntentativa 2> /dev/null
if test $? -ne 0; then
echo -e "\033[1mrm\033[0m: Partição não permite alteração de escrita (inclusão/alteração/exclusão de informação. Nada será feito."
exit 9999
else
rm $nm_part/testando_escrita$ntentativa 2> /dev/null
break
fi
done
#
# Fim do teste de escrita em partição
#
# Deveria criar o diretório .Trash-$USER na hora de mover, mas vou fazer aqui, até para evitar criar
# mais um if lá para saber se é uma partição diferente da raiz ou não
#
if test `echo $nm_part | cut -f2 -d"/"` != "home";then
test -d $nm_part/.Trash-$USER || mkdir $nm_part/.Trash-$USER 2> /dev/null
if test $? -ne 0; then
echo -e "\033[1mrm\033[0m: Erro na criação da lixeira $nm_part/.Trash-$USER. Nada será feito."
exit 9999
fi
fi
else
#################################################################
# Neste ponto já se sabe que o arquivo é da raiz, ai
# define-se que a lixeira dele será $HOME/.Trash
#
lixeiraDestino="$lixeiraDestino $HOME/.Trash"
fi
# Verifica se o arquivo/diretório não existe
if test ! -f $arquivo -a ! -d $arquivo; then
echo -e "\033[1mrm:\033[0m Impossível remover \"\033[1m$arquivo\033[0m\": Arquivo não existe."
exit 9999
fi
# Pede autorização para "remover" o diretório
if test -d $arquivo; then
if test "$eh_dir" = "2"; then # Pede confirmação para mover o diretório para lixeira
opSN=""
echo -e "\n\nConfima remoção do diretório \033[1m$arquivo\033[0m (s/N)? \c"
read opSN
[[ $opSN = [Ss] ]] && continue
echo -e "\033[1mrm:\033[0m Nada foi feito."
exit 9999
elif test "$eh_dir" = "1"; then #Não libera a "remoção"
echo -e "\033[1mrm:\033[0m Impossível remover, é um \033[1mDiretório\033[0m."
exit 9999
fi
fi
# Verifica se é arquivo e tem permissão de remoção
test -w $arquivo && continue
echo -e "\033[1mrm:\033[0m Impossível remover \"\033[1m$arquivo\033[0m\": Verifique."
exit 9999
done
arquivos=$arq_a_rm
set `echo $lixeiraDestino` # Deixa lista de Lixeiras a disposição do shell através das variáveis $1, $2, ....
for arquivo in $arquivos;do
wTrash=$1 # Lixeira de trabalho atual
shift # Elimina a atual e deixa a próxima pronta para o uso
mv --backup=t $arquivo $wTrash
done
eh_particao.sh
#!/bin/bash
#
# Consite se PATH é uma partição
#
# Sugestão de função: MYTHUS
# Implementada por: Cristiano
# Data: 22/08/2007
#
#
# Rotina só aceita um parametro, que deve ser obrigatóriamente um PATH/arquivo (não é mais verdade
# Caso tenha sido apenas passado o nome de um arquivo do diretório atual (sem o percurso), este é adicionado para verificação,
# pelo path, se esta dentro de uma partição ao não
#
#
# Alterações:
# - Adaptação para retornar o diretório da partição caso passe um segundo parametro
# solicitando a informação. Alteração realizada a fim de atender a necessidade de
# se criar a pasta .Trash-$USER Sugestão: Mythus Implementação: Cristiano - 25/08/2007
test `basename $1` = "$1" && parametro="`pwd`/$1" || parametro=$1
retornaPath=${2:-False} # Se for "True" ele retorna, se não responder nada assume False
# Caso o PATH passado não seja um direto (exemplo.: ../../outra_pasta/arquivo) o PATH é corrigido
#
if test "`echo $parametro | cut -c1-1`" = "."; then
dir_arquivo=`dirname $parametro`
dir_atual=`pwd`
cd $dir_arquivo
parametro="`pwd`/`basename $1`"
cd $dir_atual
fi
while true; do
tem_corresp=`df | grep $parametro`
if test "$tem_corresp" = ""; then
# Neste caso não achou uma partição correspondente ao PATH passado.
parametro=`dirname $parametro`
test "$parametro" = "/" && exit 3 # neste caso não era uma partição
continue
else
tem_corresp=`df | grep $parametro | tr -s " " | cut -f6 -d" "`
[[ $retornaPath = [tT][rR][uU][eE] ]] && test "$tem_corresp" = "$parametro" && echo $tem_corresp
exit 0 #aqui é uma partição
fi
done
Obs.: Como eu sou medroso antes de executar a rotina eu pego todas as linhas que tem o comando rm, e também a última que move os arquivos para a lixeira e coloco dentro de um echo para mostrar o que faria, e não fazer. Afinal vai que tem um erro grave e eu perco tudo. Só para exemplificar segue uma das linhas que altero para rodar o script (primeiro como esta aqui, e depois como eu rodo):
mv --backup=t $arquivo $wTrash
echo "mv --backup=t $arquivo $wTrash"