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á.