unix - test - Línea de comando: tuberías encuentran resultados a la rm
tuberias en linux pdf (4)
Estoy tratando de encontrar un comando que elimine archivos sql anteriores a 15 días.
La parte de buscar funciona, pero no la rm.
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?
En realidad estás rm
la salida de rm
a la entrada de find
. Lo que quiere es usar la salida de find
como argumentos para rm
:
find -type f -name ''*.sql'' -mtime +15 | xargs rm
xargs
es el comando que "convierte" su entrada estándar en argumentos de otro programa o, como lo ubican con mayor precisión en la página man
,
construir y ejecutar líneas de comando desde entrada estándar
Tenga en cuenta que si los nombres de archivo pueden contener caracteres en blanco, debe corregir eso:
find -type f -name ''*.sql'' -mtime +15 -print0 | xargs -0 rm
Pero en realidad, find
tiene un atajo para esto: la opción -delete
:
find -type f -name ''*.sql'' -mtime +15 -delete
Tenga en cuenta las siguientes advertencias en el 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 la conexión directa a rm
no es una opción, porque rm
no espera nombres de archivos en la entrada estándar. Lo que estás haciendo actualmente es conectarlos hacia atrás.
Otro método más simple es usar el comando locate
. Úsalo xargs
.
Por ejemplo,
locate file.txt | xargs rm
locate *something* | xargs rm
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 y arrojará de forma clara los archivos que se eliminan a medida que se eliminan.
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 {} /;
find /usr/www/bar/htdocs -mtime +15 -exec rm {} /;
Seleccionará los archivos en /usr/www/bar/htdocs
anteriores a 15 días y los eliminará.