Línea de comando: tuberías encontrar resultados a rm


140

Estoy tratando de elaborar un comando que elimine archivos sql anteriores a 15 días.

La parte de búsqueda funciona pero no la rm.

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

Expulsa una lista de exactamente los archivos que quiero eliminar, pero no los elimina. 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?

Respuestas:


274

En realidad, está canalizando rmla salida a la entrada de find. Lo que desea es utilizar la salida de findcomo argumentos para rm:

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

xargses el comando que "convierte" su entrada estándar en argumentos de otro programa o, como lo ponen con mayor precisión en la manpágina,

construir y ejecutar líneas de comando desde la entrada estándar

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

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

Pero en realidad, findtiene un atajo para esto: la -deleteopción:

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

Tenga en cuenta las siguientes 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.

PD Tenga en cuenta que canalizar directamente rmno es una opción, porque rmno espera nombres de archivo en la entrada estándar. Lo que estás haciendo actualmente es canalizarlos hacia atrás.


1
Gracias. Leí la página del manual y probé esa bandera. Estoy pasando una ruta completa pero volviendo "/ usr / www2 / bar / htdocs / foo / rsync / httpdocs / db_backups /: la ruta relativa potencialmente no es segura". ¿Alguna idea de por qué?
jerrygarciuh

1
@jerrygarciuh echa un vistazo aquí .
Lev Levitsky

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

1
@jerrygarciuh Ay, espero que no se haya perdido nada valioso ... 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.No estoy seguro de cómo eso importaría dadas las otras opciones que usaste, pero ¿lo intentaste?
Lev Levitsky

No, no lo hice pero no se perdió nada. Estos archivos se sincronizan desde otro servidor donde también se almacenan.
jerrygarciuh

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

Seleccionará archivos de /usr/www/bar/htdocsmás de 15 días y los eliminará.


Prefiero su respuesta que la aceptada debido al "espacio en el nombre". Se maneja mejor con el comando "-exec" que pipe. Gracias.
Slim Aloui

3

Otro método más simple es usar el locatecomando. Luego, canalice el resultado a xargs.

Por ejemplo,

locate file | xargs rm

2

Suponiendo que no está 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, ya que generará de manera detallada los archivos que se eliminarán a medida que se eliminen.

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

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.