2012-06-25 17 views
89

Estoy tratando de encontrar un comando que elimine archivos sql anteriores a 15 días.Línea de comando: resultados de búsqueda de tuberías a rm

La parte de buscar funciona, pero no la memoria.

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

Inicia una lista de exactamente los archivos que quiero eliminar pero no los borra. Los caminos son correctos.

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 

¿Qué estoy haciendo mal?

Respuesta

186

En realidad se está Piping rm 's salida a la entrada de find. Lo que queremos es utilizar la salida de find como argumentos a rm:

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

xargs es el comando que "convertidos" su entrada estándar en argumentos de otro programa, o, ya que con más precisión lo puso en man las páginas,

crear y ejecutar líneas de comandos desde la entrada estándar

Tenga en cuenta que si los nombres de archivo pueden contener caracteres de espacio en blanco, se debe corregir para que:

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

Pero, en realidad, find tiene un acceso directo para esto: la opción -delete:

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

Por favor, tenga en cuenta de la después de recibir advertencias en 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 Tenga en cuenta que la canalización directa a rm no es una opción, porque rm no espera nombres de archivo en la entrada estándar. Lo que estás haciendo actualmente es conectarlos hacia atrás.

+1

Gracias. Leí la página del hombre y le di una oportunidad a esa bandera. Estoy pasando una ruta completa pero obtengo "/ usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups /: ruta relativa potencialmente no segura". ¿Alguna idea de por qué? – jerrygarciuh

+1

@jerrygarciuh eche un vistazo [aquí] (http://www.mail-archive.com/[email protected]/msg16944.html). –

+0

gracias. No estoy seguro de haber seguido bien la publicación, pero cuando emulé su solución y puse -delete al final del comando eliminó todos los archivos sql independientemente del tiempo de modificación ... pero no tenía la advertencia, así que supongo eso es progreso ... – jerrygarciuh

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

seleccionará archivos en /usr/www/bar/htdocs más de 15 días y eliminarlos.

0

Otro método más simple es usar el comando locate. Úselo xargs.

Por ejemplo,

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

Suponiendo que no están en el directorio que contiene los archivos de copia de seguridad * .sql:

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

La opción -v anterior es útil que lo hará más detallados de salida que los archivos se eliminan a medida que se eliminan.

Me gusta enumerar primero los archivos que se eliminarán para estar seguro. MI.g:

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