2012-06-25 4 views
89

Sto cercando di elaborare un comando che cancella i file sql più vecchi di 15 giorni.Riga di comando: piping find results to rm

La parte di ricerca funziona ma non il rm.

rm -f | find -L /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups -type f \(-name '*.sql' \) -mtime +15 

Fa fuori un elenco di esattamente i file che desidero cancellati ma non li elimina. I percorsi sono corretti.

usage: rm [-f | -i] [-dIPRrvW] file ... 
     unlink file 
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120601.backup.sql 
... 
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120610.backup.sql 

Cosa sto sbagliando?

risposta

186

Si sono effettivamente tubazioni s' rmuscita all'ingresso di find. Ciò che si vuole è quello di utilizzare l'uscita di find come argomenti a rm:

find -type f -name '*.sql' -mtime +15 | xargs rm 

xargs è il comando che "convertiti" il suo standard input in argomenti di un altro programma, o, come hanno più accuratamente messo su i man pagina,

creare ed eseguire righe di comando dallo standard input

Si noti che se i nomi dei file possono contenere caratteri di spaziatura, si dovrebbe correggere che:

find -type f -name '*.sql' -mtime +15 -print0 | xargs -0 rm 

Ma in realtà, find ha una scorciatoia per questo: l'opzione -delete:

find -type f -name '*.sql' -mtime +15 -delete 

Si prega di essere a conoscenza del seguenti avvisi in man find:

Warnings: Don't forget that the find command line is evaluated 
    as an expression, so putting -delete first will make find try to 
    delete everything below the starting points you specified. When 
    testing a find command line that you later intend to use with 
    -delete, you should explicitly specify -depth in order to avoid 
    later surprises. Because -delete implies -depth, you cannot 
    usefully use -prune and -delete together. 

PS Si noti che il piping diretto a rm non è un'opzione, poiché rm non prevede nomi di file su input standard. Quello che stai facendo è rimandare indietro.

+1

Grazie. Ho letto la pagina man e ho provato quella bandiera. Sto passando un percorso completo ma tornando indietro "/ usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups /: percorso relativo potenzialmente non sicuro". Qualche idea del perché? – jerrygarciuh

+1

@jerrygarciuh dai uno sguardo [qui] (http://www.mail-archive.com/[email protected]/msg16944.html). –

+0

grazie. Non sono sicuro di aver seguito bene il post ma quando ho emulato la loro soluzione e ho messo -delete alla fine del comando ha cancellato tutti i file sql indipendentemente dal tempo della mod ... ma non aveva l'avviso quindi immagino questo è il progresso ... – jerrygarciuh

19
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \; 

selezionerà i file in /usr/www/bar/htdocs età superiore a 15 giorni e rimuoverli.

0

Un altro metodo più semplice è utilizzare il comando locate. Usalo xargs.

Per esempio,

locate file.txt | xargs rm 
locate *something* | xargs rm 
0

si Supponendo che non sono nella directory contenente i file di backup * .sql:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec rm -v {} \; 

L'opzione -v di cui sopra è a portata di mano lo farà verbosely uscita quali file vengono eliminati man mano che vengono rimossi.

Mi piace elencare i file che verranno eliminati per sicurezza. E.g:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;