Pagina 1 di 1

find . -name *~ | rm Dove sbaglio?

Inviato: sab 1 dic 2012, 0:56
da darkstaring
Olaaaa a tutti.. stavo provando ad eliminare tutti i file di backup all'interno della directory dove mi trovavo con

Codice: Seleziona tutto

find . -name *~ | rm
Da qual chè ho capito il pipe serve a mandare l'output del primo comando su quello successivo..
Se è così, perchè non funziona???

il comando
find . -name *~ mi restituisce tutti i file che vorrei eliminare...
Devo aggiunge qualcosa del genere {$1} dopo rm?

E' una cosa importante che vorrei capire bene una volta per tutte :o
Mi potete spiegare?

Grazie Francesco

Re: find . -name *~ | rm Dove sbaglio?

Inviato: sab 1 dic 2012, 6:07
da Thraphyx
Puoi ottenere quello che vuoi in diversi modi, ad esempio

Codice: Seleziona tutto

find . -iname "*~" -exec rm '{}' \;
Se la tua intenzione era quella di redigire l'output da find a rm, non puoi farlo "direttamente", ma devi ricorrere a xargs

Codice: Seleziona tutto

find . -iname "*~" -print0 | xargs -0 rm 
find e xargs sono comandi molto potenti, un buon passo per iniziare a conoscerli meglio è leggere il manuale :o

Codice: Seleziona tutto

man find
man xargs

Re: find . -name *~ | rm Dove sbaglio?

Inviato: sab 1 dic 2012, 9:20
da darkstaring
Grazie Thraphyx.. queste chicche mi mancavano :)

Re: find . -name *~ | rm Dove sbaglio?

Inviato: sab 1 dic 2012, 11:29
da 414N
Aggiungo che è inutile ricorrere ad exec + rm quando si vogliono eliminare i risultati della ricerca: esiste il comando -delete che fa proprio questo:

Codice: Seleziona tutto

find . -iname "*~" -delete

Re: find . -name *~ | rm Dove sbaglio?

Inviato: sab 1 dic 2012, 13:43
da targzeta
Occhio ad usare il '-delete'. Ricorda che tutti i comandi per find sono dei filtri in AND (di default) che lui esegue uno dopo l'altro nell'ordine della command line. Cosa voglio dire con questo, che se per sbaglio metti prima il '-delete' e poi il '-iname' ti sei giocato tutti i file.

Esempio:

Codice: Seleziona tutto

cd /tmp
mkdir casa
cd casa
touch {a,b}{1..9}
ls
a1  a2  a3  a4  a5  a6  a7  a8  a9  b1  b2  b3  b4  b5  b6  b7  b8  b9
Ora, se io voglio eliminare tutti i file che iniziano con 'a', correttamente con find:

Codice: Seleziona tutto

find . -name 'a*' -delete
ls
b1  b2  b3  b4  b5  b6  b7  b8  b9
Ricreiamoli:

Codice: Seleziona tutto

touch a{1..9}
ls
a1  a2  a3  a4  a5  a6  a7  a8  a9  b1  b2  b3  b4  b5  b6  b7  b8  b9
se invece per errore metto prima il '-delete':

Codice: Seleziona tutto

find . -delete -name 'a*'
ls
tutti i file eliminati.

Quindi, occhio a quelli che si fa,
Emanuele