Riga di comando: piping trova risultati in rm


140

Sto cercando di elaborare un comando che elimina i file sql più vecchi di 15 giorni.

La parte di ricerca funziona ma non l'rm.

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

Elimina un elenco esattamente dei file che voglio eliminare ma non li cancella. 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

Che cosa sto facendo di sbagliato?

Risposte:


274

In realtà si sta tubazioni rm's uscita all'ingresso di find. Quello che vuoi è usare l'output di findcome argomenti per rm:

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

xargsè il comando che "converte" il suo input standard in argomenti di un altro programma o, come più accuratamente lo inseriscono nella manpagina,

costruire ed eseguire le righe di comando dall'input standard

Si noti che se i nomi dei file possono contenere caratteri di spazi bianchi, è necessario correggere ciò:

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

Ma in realtà, findha una scorciatoia per questo: l' -deleteopzione:

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

Si prega di essere consapevoli delle seguenti avvertenze 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 Nota che il piping diretto a rmnon è un'opzione, perché rmnon si aspettano nomi di file sull'input standard. Quello che stai attualmente facendo è reindirizzarli all'indietro.


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

1
@jerrygarciuh dai un'occhiata qui .
Lev Levitsky,

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 eliminato tutti i file sql indipendentemente dal tempo mod ... ma non aveva l'avviso quindi immagino questo è progresso ...
jerrygarciuh,

1
@jerrygarciuh Ahi, spero che non sia stato perso nulla di prezioso ... mandice: 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.Non sono sicuro di come sarebbe importante date le altre opzioni che hai usato, ma ci hai provato?
Lev Levitsky,

No, non l'ho fatto ma non è stato perso nulla. Questi file sono risincronizzati da un altro server in cui sono anche memorizzati.
jerrygarciuh,

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

Selezionerà i file in /usr/www/bar/htdocsmeno di 15 giorni e li rimuoverà.


Preferisco la tua risposta rispetto a quella accettata a causa dello "spazio nel nome". È meglio gestito con il comando "-exec" che pipe. Grazie.
Slim Aloui,

3

Un altro metodo più semplice è usare il locatecomando. Quindi, convoglia il risultato a xargs.

Per esempio,

locate file | xargs rm

2

Supponendo che non ci si trovi 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 sopra è utile per generare in modo dettagliato quali file vengono eliminati quando vengono rimossi.

Mi piace elencare i file che verranno eliminati per primi per essere sicuri. Per esempio:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.