tuberias test son script salida redireccionamiento que programacion los letras español entrada ejemplos comandos comando unix command-line find rm

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