Page 1 of 1

[TIP] il cestino per la shell!!! aka shellTrash

Posted: Thu Mar 22, 2007 2:41 pm
by RollsAppleTree
Quante volte avrete detto:
porca misera, ho cancellato dei file importantissimi!!! Adesso come li recupero???
Se li avete cancellati via interfaccia grafica, nessun problema… li avete nel cestino…

Ma se li avete cancellati via linea di comando???

Stavo lavorando alla mia tesi, ed ero anche arrivato ad un buon punto, quando -PORCA MISERIACCIA- un “rm” malandrino mi ha cancellato dei file importantissimi!!!
SCONFORTO E TERRORE !!!
Per questo mi sono deciso a scrivere questo piccolo scriptino che crea un “cestino” anche per i files cancellati da riga di comando, per intenderci, con il solito “rm” …

eccolo:
no-rm.sh

Code: Select all

#!/bin/bash
touch .tmpListaFinale # file temporaneo di appoggio, metterò li la lista di switch legali del mio fake-rm
for comandi in $*
do
if [ $comandi != '-rf' ]
then
echo -n $comandi >> .tmpListaFinale # se è diverso da "-r" lo metto nella lista
echo -n " ">>.tmpListaFinale # poi metto uno spazio
else
echo -n " -f ">>.tmpListaFinale
fi
done
echo "eseguo: mv" `cat .tmpListaFinale` nel cestino# echo di debug
mv `cat .tmpListaFinale` ~/.Trash # rimuovo il file temporaneo
Veramente semplice, no?

Non fa altro che leggere il vostro comando, controllare che non ci siano dei “-r” tra gli switch (per la cancellazione ricorsiva, il comando mv non ha questo switch, e darebbe errore) e trasforma il tutto in un bel mv…
Ovvero sposta i files nel cestino (si, proprio così, nel cestino del vostro desktop) !!!

Diamo i permessi di esecuzione allo script:

Code: Select all

chmod +x no-rm.sh
Adesso non ci resta che fare un bell’alias …

Code: Select all

nano ~/.bashrc
in maniera tale che ogni volta che scriviamo “rm” invece mandi inesecuzione il nostro script:

Code: Select all

alias rm='/home/$USER/no-rm.sh'
Ed il gioco dovrebbe essere fatto :D

N.B. E’ ovvio che questo script sarebbe potuto essere scritto meglio, ma il mio intento era solo quello di sbrigarmi nel farlo e soprattutto di rendere trasparente all’utente l’utilizzo dell’alias.
In ogni caso funziona perfettamente :D

Altri script simili:

http://poetry.freaknet.org/poetryminiho ... _linux_ram
http://www.debianitalia.org/modules/wfs ... ticleid=78
http://www.lugnu.it/index.php?option=co ... 3&Itemid=2

credits: my blog!!! :D
http://rollsappletree.altervista.org/20 ... -tua-bash/

Re: [TIP] il cestino per la shell!!! aka shellTrash

Posted: Sat Mar 24, 2007 12:50 pm
by Guglie
un po' di consigli:

Code: Select all

if [ $comandi != '-rf' ]
mv non ha l'opzione di ricorsività (visto che sposta direttamente tutte le sottodirectory), che però si può passare
con in 3 modi (-r, -R, --recursiv).
inoltre l'opzione -r la si può passare attaccata ad altre (rm -rf name_dir) oppure singolarmente (rm -r -f name_dir)

perciò ti consiglio di usare un parser degli argomenti (come getopt) per togliere in modo più pulito -r

Code: Select all

mv `cat .tmpListaFinale` ~/.Trash # rimuovo il file temporaneo
nemmeno questo è molto pulito: se hai una partizione per /home e un'altra per / e cancelli un file che non è nella home del tuo utente il file viene prima copiato sull'altra partizione e poi cancellato. freedeskotp prevede una directory /.Trash per questi casi

se hai voglia di perfezionarlo ti consiglio di leggere le specifiche di freedesktop per l'implementazione di Trash

Re: [TIP] il cestino per la shell!!! aka shellTrash

Posted: Tue Mar 27, 2007 3:35 am
by cloc3
RollsAppleTree wrote:

Code: Select all

alias rm='/home/$USER/no-rm.sh'
ma adesso, se l'utente vuole vuotare il cestino, che comando usa?

inoltre. c'è una ragione per generare un file temporaneo listafinale?
mi sembra che tu non cancelli quel file ( touch è diverso da > ) e accedi ad esso in append, in modo che al secondo accesso rimane memoria del primo.
io avrei preferito una variabile interna, che funziona in questo modo:

Code: Select all

cloc3@s939 ~/prova $ cat listaFinale.sh 
#!/bin/bash
listaFinale=""
for comandi in $*; do
 listaFinale=${listaFinale}" "$comandi
done
echo $listaFinale

Re: [TIP] il cestino per la shell!!! aka shellTrash

Posted: Tue Mar 27, 2007 4:15 pm
by RollsAppleTree
cloc3 wrote:
RollsAppleTree wrote:

Code: Select all

alias rm='/home/$USER/no-rm.sh'
ma adesso, se l'utente vuole vuotare il cestino, che comando usa?
tasto destro-> svuota cestino :D
cloc3 wrote: inoltre. c'è una ragione per generare un file temporaneo listafinale?
mi sembra che tu non cancelli quel file ( touch è diverso da > ) e accedi ad esso in append, in modo che al secondo accesso rimane memoria del primo.
io avrei preferito una variabile interna, che funziona in questo modo:

Code: Select all

cloc3@s939 ~/prova $ cat listaFinale.sh 
#!/bin/bash
listaFinale=""
for comandi in $*; do
 listaFinale=${listaFinale}" "$comandi
done
echo $listaFinale
ehmmm ... non sapevo come concatenare variabili interne .... :D

cmq continuiamo a suggerire, così ne facciamo na versione bellina (ovvero ben lontana dalla mia :D )... è veramente na seccatura quando nella cancellazione spasmodica via shell facciamo fuori cose importanti ...[/quote]

Re: [TIP] il cestino per la shell!!! aka shellTrash

Posted: Tue Mar 27, 2007 8:51 pm
by cloc3
RollsAppleTree wrote: tasto destro-> svuota cestino :D
:D
perfetto. da console. incrocio le dita che Kde non abbia definito anche lui l'alias nel proprio environment.
in tal caso puoi sempre loggarti da root ... :D .
RollsAppleTree wrote: cmq continuiamo a suggerire
bè, il consiglio migliore viene da Guglie.
per il resto, man bash.