ejemplos shell unix find xargs

shell - ejemplos - Que es más rápido, ''find-exec'' o ''find | xargs-0 ''?



xargs rm (3)

Espero que la versión de xargs sea un poco más rápida ya que no está generando un proceso para cada nombre de archivo. Pero, me sorprendería si realmente hubiera mucha diferencia en la práctica. Si le preocupa la larga lista que xargs envía a cada invocación de rm, puede usar -l con xargs para limitar la cantidad de tokens que usará. Sin embargo, xargs conoce la longitud más larga de cmdline y no irá más allá de eso.

En mi aplicación web, renderizo páginas usando script PHP, y luego genero archivos HTML estáticos de ellas. El HTML estático se sirve a los usuarios para acelerar el rendimiento. Los archivos HTML se vuelven obsoletos y deben borrarse.

Estoy debatiendo entre dos formas de escribir el guión de desalojo.

El primero es usar un solo comando de búsqueda, como

find /var/www/cache -type f -mmin +10 -exec rm /{} /;

La segunda forma es conectando xargs, algo así como

find /var/www/cache -type f -mmin +10 -print0 | xargs -0 rm

La primera forma invoca rm para cada archivo que encuentra, mientras que la segunda forma simplemente envía todos los nombres de archivo a una sola rm (pero la lista de archivos puede ser muy larga).

¿Qué forma sería más rápida?

En mi caso, el directorio de caché se comparte entre unos pocos servidores web, por lo que todo esto se hace a través de NFS, si eso es importante para este problema.


La versión de xargs es mucho más rápida con muchos archivos que la versión -exec cuando la publicaste, esto se debe a que rm se ejecuta una vez por cada archivo que quieras eliminar, mientras que xargs agrupará tantos archivos como sea posible en una sola rm mando.

Con decenas o cientos de miles de archivos, puede ser la diferencia entre un minuto o menos en comparación con la mayor parte de una hora.

Puede obtener el mismo comportamiento con -exec terminando el comando con un "+" en lugar de "/;". Esta opción solo está disponible en las versiones más recientes de find .

Los siguientes dos son aproximadamente equivalentes:

find . -print0 | xargs -0 rm find . -exec rm /{} +

Tenga en cuenta que la versión xargs aún se ejecutará un poco más rápido (en un pequeño porcentaje) en un sistema multiprocesador, ya que parte del trabajo se puede paralelizar. Esto es particularmente cierto si se trata de una gran cantidad de cálculos.