Como apagar ficheiros na consola de modo seguro?

Iniciado por andrejbo, 20 de Agosto de 2007, 08:16

tópico anterior - próximo tópico

andrejbo

à dias aconteceu-me apagar com o rm -r ficheiros que não queria apagar... a questão que coloco é se não há maneira de enviar esses ficheiros pro trash ou algo parecido!!!!!

Mythus

Mover para a lixeira?
mv ARQUIVO|DIRETORIO DESTINO
Pode ter vários argumentos, entre eles:
-i modo interativo
-b cria um backup simples (coloca um ~ no final do arquivo) se já existe um arquivo com mesmo nome no destino
--backup=t cria um backup enumerado se já existe um arquivo com mesmo nome no destino

A maneira mais segura é:
mv --backup=t arquivo1 arquivoN diretório1 diretórioN caminho/dir-a-ser-movido caminho/arquivo-a-ser-movido ~/.Trash

A maneira mais simples:
mv -b lista a ser movida ~/.Trash

Uma outra forma para remover (e não enviar à lixeira) é ligar o modo interativo
rm -i lista

Limpar lixeira:
rm -rf -- ~/.Trash/*
Se houver arquivos iniciados por ponto, você vai ter que fazer um pequeno malabarismo:
rm -rf -- ~/.Trash/* ~/.Trash/.[^.]*
Onde:
".[^.]*" significa "iniciados por ponto e com o segundo caractere diferente de ponto, seguido ou não por qualquer caractere".

Mais infos: man mv e man rm

Espero ter ajudado
Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.

Mythus

Agora, se você criar um arquivo iniciado por .. você vai ter que removê-lo sozinho porque eu não vou lhe ajudar ;)
Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.

andrejbo

Obrigado pela ajuda...

Porque será que começamos logo a usar o rm em vez do mv ?!!!! :(

Não te preocupes com o remover os ficheiros começados por .. que isso agora é só somar 1+1=2  ;D

clcampos

#4
Posso brincar?

E se usarmos uma rotina que ao invés de remover o arquivo o envia para o diretório /home/USUÁRIO/.Trash? Ai criamos um alias e toda vez que chamarmos o comando rm é a rotina que é executada, não removendo nada e simplesmente enviando os arquivos para a pasta .Trash.

Para não dizer que a brincadeira ficou só na idéia fiz o seguinte:

Criei uma rotina com o nome remove_seguro.sh com o seguinte conteúdo:


#!/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
#

arquivos=$*      # Nomes de Arquivos passados por parametro

# 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
       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

    # Verifica se é diretório
    if test -d $arquivo; then
       echo -e "\033[1mrm:\033[0m Impossível remover \"\033[1m$arquivo\033[0m\": É um diretório."
       exit 9999
    fi

    # Verifica se o arquivo não existe
    if test ! -f $arquivo; then
       echo -e "\033[1mrm:\033[0m Impossível remover \"\033[1m$arquivo\033[0m\": Arquivo não existe."
       exit 9999
    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

for arquivo in $arquivos;do

    mv $arquivo $HOME/.Trash

done


Após isto dei permissão de execução ao arquivo:

$ chmod 755 remove_seguro.sh

E criei o alias:

$ alias rm="sh /home/MEU-USUARIO/Scripts/remove_seguro.sh "

Bem como foi uma brincadeira me dei ao trabalho de verificar os parametros quanto a:


  • Se é um diretório
  • Se o arquivo existe
  • Se temos direito a remoção do arquivo

Como limitação não me interessei em consistir se o comando (o shell no caso) é chamado com opções do comando rm. Sendo assim caso alguma opção seja definida no comando (-r, -f, e etc) a rotina simplesmente chama o comando diretamente e realmente remove aquilo que esta para ser removido.

Fiz muitos testes e não tive problemas mas não me responsabilizo pelo uso da rotina.

== EDIT ==

Outra limitação só pensada agora é que se executarem a rotina para arquivos dentro da pasta .Trash a rotina simplesmente tentará mover o arquivo para ela mesmo, e ai?
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

Mythus

Pode puxar o banquinho e brincar também!

Talvez fosse melhor criar um alias para rms (rm seguro) em vez de mexer diretamente no alias do rm.

Você não previu uma coisa: arquivos começados por "-" viu que eu coloquei o parâmetro "--" no comando do rm? hehe

$* pega todos os parâmetros? Eu uso $@ que é mais bonitinho ;) gostei do jeito que você lê se começa ou não com -, mas acho que tens que primeiro testar se o arquivo existe para depois dizer que é parâmetro. Outra coisa: porque impor uma limitação em mover um diretório?

Uma coisa que eu estava pensando depois é que talvez seja interessante saber de onde ele está removendo porque, se for dentro de /media/dir/ ao lançar o arquivo para ~/.Trash além de ser mais demorado (porque vai estar movendo um arquivo de uma partição para outra), pode acabar enchendo a partição do seu home.

Talvez se fizer um teste como `pwd | grep ^/media | wc -l` se der 0 então vai pro ~/.Trash/; se der 1 vai para `pwd |cut -d / -f 1,2,3`/.Trash-$USER/ (mas, claro, tem que saber se o diretório existe, caso não exista, tem que criá-lo).

Tô gostando da brincadeira. :D
Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.

clcampos

#6
Citação de: Mythus online 22 de Agosto de 2007, 01:05
Pode puxar o banquinho e brincar também!

É essa a idéia.

Citar
Talvez fosse melhor criar um alias para rms (rm seguro) em vez de mexer diretamente no alias do rm.

Pensei em criar como rm para dar segurança mesmo aos novatos e desatentos (como eu), assim eles não usariam o comando errado por engano, mas como é uma brincadeira fica a cargo.

Citar
Você não previu uma coisa: arquivos começados por "-" viu que eu coloquei o parâmetro "--" no comando do rm? hehe

Feito para arquivos iniciados com "-".

Citar$* pega todos os parâmetros? Eu uso $@ que é mais bonitinho ;) gostei do jeito que você lê se começa ou não com -, mas acho que tens que primeiro testar se o arquivo existe para depois dizer que é parâmetro. Outra coisa: porque impor uma limitação em mover um diretório?

Dava algum trabalho extra ver se o arquivo começa com "-", mas abaixo já ta corrigido, e limitei os diretórios por limitar, mas já esta tirado... hehehe

Citar
Uma coisa que eu estava pensando depois é que talvez seja interessante saber de onde ele está removendo porque, se for dentro de /media/dir/ ao lançar o arquivo para ~/.Trash além de ser mais demorado (porque vai estar movendo um arquivo de uma partição para outra), pode acabar enchendo a partição do seu home.

Talvez se fizer um teste como `pwd | grep ^/media | wc -l` se der 0 então vai pro ~/.Trash/; se der 1 vai para `pwd |cut -d / -f 1,2,3`/.Trash-$USER/ (mas, claro, tem que saber se o diretório existe, caso não exista, tem que criá-lo).

Tô gostando da brincadeira. :D

A verificar, até porque "outros sistemas" não enviam para a lixeira arquivos removidos de disquete, pen drive e etc, e a rotina não preve isto. De qualquer forma o shell já para sua execução se algum arquivo vindo de media, ou mnt estiver entre os parametros, mas não acho suficiente, devemos ver o que fazer realmente nestes casos.

De qualquer forma (e agora sem qualquer teste) algumas alterações foram feitas, ainda falta muito, já que não foi implementado nada para quando estivermos tentando remover algo de outra partição, apenas fechando a rotina.

As alterações estão documentadas nos comentários.


#!/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
#

arquivos=$*      # Nomes de Arquivos passados por parametro

# 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"; then
       rm $arquivo
    fi

    # Verifica Partição
    eh_particao=`echo $arquivo | cut -f2 -d"/"`

    if test "$eh_particao" = "media" -o "$eh_particao" = "mnt"; then
       echo -e "\033[1mrm:\033[0m Impossível remover \"\033[1m$arquivo\033[0m\": Não é na partição raiz."
       exit 9999
    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

    # 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

for arquivo in $arquivos;do

    mv $arquivo $HOME/.Trash

done
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

Mythus

Citação de: clcampos online 22 de Agosto de 2007, 01:46
Citação de: Mythus online 22 de Agosto de 2007, 01:05
Uma coisa que eu estava pensando depois é que talvez seja interessante saber de onde ele está removendo porque, se for dentro de /media/dir/ ao lançar o arquivo para ~/.Trash além de ser mais demorado (porque vai estar movendo um arquivo de uma partição para outra), pode acabar enchendo a partição do seu home.

Talvez se fizer um teste como `pwd | grep ^/media | wc -l` se der 0 então vai pro ~/.Trash/; se der 1 vai para `pwd |cut -d / -f 1,2,3`/.Trash-$USER/ (mas, claro, tem que saber se o diretório existe, caso não exista, tem que criá-lo).

A verificar, até porque "outros sistemas" não enviam para a lixeira arquivos removidos de disquete, pen drive e etc, e a rotina não preve isto. De qualquer forma o shell já para sua execução se algum arquivo vindo de media, ou mnt estiver entre os parametros, mas não acho suficiente, devemos ver o que fazer realmente nestes casos.

De qualquer forma (e agora sem qualquer teste) algumas alterações foram feitas, ainda falta muito, já que não foi implementado nada para quando estivermos tentando remover algo de outra partição, apenas fechando a rotina.

Não sei se é o meu que é burrinho, mas ainda que a mídia seja removível, ele manda o arquivo para /media/usbdisk|floppy|pendrive do mesmo jeito e eu tenho que limpar a lixeira se quiser me livrar do arquivo mesmo.

Gostei do teste da lixeira, mas acho que nesse caso eu colocaria um rm -i $arquivo, já que é uma operação definitiva. ou, echo "Você tem certeza que quer apagar definitivamente o" $arquivo "?" "(N/s)" ; read certeza ; if test $certeza = S -o $certeza = s -o  $certeza = Y -o  $certeza = y   ; then rm -rf $arquivo ; fi

De repente essa coisa está crescendo, heim? ;)
Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.

clcampos

#8
Eita Mythus a brincadeira tá crescendo... hehehe

Citar
Gostei do teste da lixeira, mas acho que nesse caso eu colocaria um rm -i $arquivo, já que é uma operação definitiva. ou, echo "Você tem certeza que quer apagar definitivamente o" $arquivo "?" "(N/s)" ; read certeza ; if test $certeza = S -o $certeza = s -o  $certeza = Y -o  $certeza = y   ; then rm -rf $arquivo ; fi

Isto é tranquilo, eu só não me preocupei com isto para deixar o script com cara de linux, pediu para remover ele remove sem pedir confirmação, mas ta ai embaixo já:

Versão 0.1.2-b.4.2.897-e (hehehehe)


#!/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
#

arquivos=$*      # Nomes de Arquivos passados por parametro
arq_a_rm=""

# 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"; then
       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
    eh_particao=`echo $arquivo | cut -f2 -d"/"`

    if test "$eh_particao" = "media" -o "$eh_particao" = "mnt"; then
       echo -e "\033[1mrm:\033[0m Impossível remover \"\033[1m$arquivo\033[0m\": Não é na partição raiz."
       exit 9999
    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

    # 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

for arquivo in $arquivos;do

    mv $arquivo $HOME/.Trash

done
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

Mythus

Tua linha de teste é muito mais limpinha que a minha hehehe

Mas ainda acho que a remoção de arquivos em diretórios montados deveria ir para `pwd |cut -d / -f 1,2,3`/.Trash-$USER/ ;)

No ambiente gráfico do Fedora e do Kubuntu fazem isso por aqui por essas bandas. (e depois eu vivo deletanto o .Trash-mythus da raiz do pendrive :D )

HUM!!!!! E se desse a opção ao usuário? Algo no topo do scritp do tipo:
1) "Remova os # das linhas abaixo se não quiser remover diretórios"
#diretorios_tambem=0

2) "Remova o # da linhas abaixo se quiser remover com segurança dos arquivos em /media e /mnt"
#pontos_de_montagem=1

E lá em baixo:
if test "$pontos_de_montagem" != 1 ; then
# Verifica Partição
    eh_particao=`echo $arquivo | cut -f2 -d"/"`

    if test "$eh_particao" = "media" -o "$eh_particao" = "mnt"; then
       echo -e "\033[1mrm:\033[0m Impossível remover \"\033[1m$arquivo\033[0m\": Não é na partição raiz."
       exit 9999
    fi
fi


if test `pwd | grep ^/media | wc -l` = 1 ; then

# Verifica se a lixeira existe

    if test ! -d `pwd |cut -d / -f 1,2,3`/.Trash-$USER ; then
        mkdir `pwd |cut -d / -f 1,2,3`/.Trash-$USER
    fi

for arquivo in $arquivos; do

    mv $arquivo `pwd |cut -d / -f 1,2,3`/.Trash-$USER

done ; else

for arquivo in $arquivos; do

    mv $arquivo $HOME/.Trash

done ;
fi


Aprova o "Patch" ou tens idéia melhor? ;)
Obs.: no caso o teste if test "$diretorio" = ".Trash" deveria testar tambem .Trash-$USER

Fazia tempo que eu não brincava dessas coisas. ;D
Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.

clcampos

#10
Citação de: Mythus online 22 de Agosto de 2007, 11:00
Tua linha de teste é muito mais limpinha que a minha hehehe

Mas ainda acho que a remoção de arquivos em diretórios montados deveria ir para `pwd |cut -d / -f 1,2,3`/.Trash-$USER/ ;)

Posso trocar aqueles comandos por $HOME? Permitir que arquivos de outras partições sejam enviados a lixeira necessitará também de outras consistências, como espaço na mesma e etc, e só não implementei isto porque estou vendo a melhor consistência possível para verificar se o arquivo vem de outra partição, visto que ela pode ser montada em qualquer lugar (aqui monto em /home para ter idéia). Assim que conseguir um código enxuto, funcional, e sem erros adiciono ao nosso script estável (huahuahua).


CitarHUM!!!!! E se desse a opção ao usuário? Algo no topo do scritp do tipo:
1) "Remova os # das linhas abaixo se não quiser remover diretórios"
#diretorios_tambem=0

2) "Remova o # da linhas abaixo se quiser remover com segurança dos arquivos em /media e /mnt"
#pontos_de_montagem=1

E lá em baixo:
if test "$pontos_de_montagem" != 1 ; then
# Verifica Partição
    eh_particao=`echo $arquivo | cut -f2 -d"/"`

    if test "$eh_particao" = "media" -o "$eh_particao" = "mnt"; then
       echo -e "\033[1mrm:\033[0m Impossível remover \"\033[1m$arquivo\033[0m\": Não é na partição raiz."
       exit 9999
    fi
fi


if test `pwd | grep ^/media | wc -l` = 1 ; then

# Verifica se a lixeira existe

    if test ! -d `pwd |cut -d / -f 1,2,3`/.Trash-$USER ; then
        mkdir `pwd |cut -d / -f 1,2,3`/.Trash-$USER
    fi

for arquivo in $arquivos; do

    mv $arquivo `pwd |cut -d / -f 1,2,3`/.Trash-$USER

done ; else

for arquivo in $arquivos; do

    mv $arquivo $HOME/.Trash

done ;
fi



Podemos sim fazer isto, claro, ou então podemos deixar a opção do usuário inserir opções da nossa rotina na linha de comando. Sempre que termino um shell script coloco a opção de usar um --help para aprender a usar a rotina e ver todas as opções implementadas nela, gosto desta saida, acho ela bem elegante.

CitarAprova o "Patch" ou tens idéia melhor? ;)
Obs.: no caso o teste if test "$diretorio" = ".Trash" deveria testar tambem .Trash-$USER

Fazia tempo que eu não brincava dessas coisas. ;D

Como não aprovar suas idéias? Elas estão levando o script a um patamar maior que brincadeira...

Desta vez não vai uma nova versão, a próxima vai sair com o que sugeriu, vou tentar já implementar o uso das opções para "remoção" de diretórios e arquivos em outras partições.

[]'s

Cristiano.
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

clcampos

#11
Mythus vamos lá. Antes de mais nada preciso perguntar. O que você quer exatamente com isto aqui?

CitarMas ainda acho que a remoção de arquivos em diretórios montados deveria ir para `pwd |cut -d / -f 1,2,3`/.Trash-$USER/

Pergunto isto pelo seguinte. Eu executei o comando no meu terminal, e só apareceu a informação que já esta em $HOME. Mas estou imaginando que você quer criar (se já não existir) um diretório .Trash-$USER dentro da partição onde esta o arquivo, e ai move-lo para lá? Só que o seguinte, o comando que passou necessariamente não passa informações de partição, pois se eu estiver na minha HOME, e me referir a um arquivo pelo seu PATH não vai dar certo. Outra coisa, e se não tiver direitos de escrita nesta partição? Lógico que ai nem poderia remover, mas como ficaram muitas duvidas estou aguardando maiores informações para implementar.

O que eu implementei agora:

- Código (inclusive a parte) que descobre (de forma eficiente  ao menos nos meus testes) se o arquivo desejado esta dentro de uma partição diferente da raiz (/), e ai pergunta se o usuário realmente deseja mover o arquivo para a lixeira. Testei passando como parâmetro (todos eram caminhos válidos aqui) os dados abaixo e tive uma resposta correta em todos:


  • /media/hda2/arquivo
  • /media/hda2/Musicas/Supertramp/arquivo.mp3
  • ../../../../media/hda2/Musicas/Supertramp/arquivo.mp3
  • ../Scripts/eh_particao.sh

Sei que existem muitas outras formas de se chegar a um arquivo, mas acho que peguei o básico assim.

- Mudança para testar também .Trash-$USER
- Implementado as variáveis para controle de decisão a tomar para diretórios e arquivos em outras partições.

Ai vão os arquivos, fique atento à variável PATH_Script  que deverá ser alterada para o perfeito funcionamento ai.

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
#

###########################################################
#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=$*      # Nomes de Arquivos passados por parametro
arq_a_rm=""

#####################################################
# 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 removidos 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
    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

for arquivo in $arquivos;do

    mv $arquivo $HOME/.Trash

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

# 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
#
test `basename $1` = "$1" && parametro="`pwd`/$1" || parametro=$1

# 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
         exit 0 #aqui é uma partição
      fi
done
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

Mythus

Agora entendi o que você quis dizer! Para que o arquivo a ser movido de uma partição vá para o .Trash-$USER daquela partição!

Também entendi o problema de você montar em outros lugares, daí pensei em usar o mount para saber onde criar o .Trash-$USER e a melhor idéia que tive foi:

mkdir  `mount | grep $parametro |cut -d \  -f 3`"/.Trash-$USER"

Caso não exista.

A importância de lançar o arquivo em /ponto_de_montagem/.Trash-$USER é que tanto o Konqueror quanto o Nautilus, enxergam esses arquivos e o usuário pode esvasiar a lixeira pelo ambiente gráfico também.

Agora o que me deu um nó na cabeça agora é o cara fazer algo do tipo:

rm /media/hda1/windows/temp/*  ../hda5/filme.avi ~/foto.da.sogra.tiamate.jpg setup.exe

talvez seja até mais útil algo como

for i in @ (com os devidos testes) do ;

find $i -exec mv $i mount | grep $parametro |cut -d \  -f 3`"/.Trash-$USER

ou

find $i -exec mv $i mount | grep $parametro |cut -d \  -f 3`"/.Trash

done

HUAHAUHAUAUA minha nossa! Criamos um monstro! :D
Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.

fabiovalinhos

#13
Citação de: Mythus online 22 de Agosto de 2007, 21:03...HUAHAUHAUAUA minha nossa! Criamos um monstro! :D

Meu deus, o que vocês fizeram com o tópico do cara. Virou um shell script.

Imagino se ele perguntar como configurar algo, o tamanho que vai vir o próximo script.
eheheh
7355
sudo dpkg no seu quadrado ...sudo dpkg no seu quadrado ...
http://www.youtube.com/watch?v=tHmrq0FtczM

clcampos

Citação de: fabiovalinhos online 22 de Agosto de 2007, 23:44
Citação de: Mythus online 22 de Agosto de 2007, 21:03...HUAHAUHAUAUA minha nossa! Criamos um monstro! :D

Meu deus, o que vocês fizeram com o tópico do cara. Virou um shell script.

Imagino se ele perguntar como configurar algo, o tamanho que vai vir o próximo script.
eheheh
7355

Claro que ele não pediu nada disto, e que virou uma brincadeira minha e do Mythus, mas se ele implementar o script como esta tenho certeza que não perderia nada, e seria sim uma remoção segura.
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!