Pregunta Usando `find` para borrar


Entonces, dadas tres opciones ...

  1. find .... -delete 
  2. find .... | xargs rm ... 
  3. find .... -exec rm ...; 

... o variaciones de los mismos, ¿qué opción es preferible?
Supongo que no hay una respuesta rápida y difícil, y una situación específica dictará la mejor opción (¡por favor, dales un nombre!)

Aclamaciones.


7
2017-07-28 13:27


origen


Olvidaste una: find ... -exec rm ...+que es similar en velocidad a la xargs versión. - Dennis Williamson
Ten cuidado, algunos de ellos tienen comportamientos diferentes. Por ejemplo, si la ruta tiene un espacio en ella, la segunda opción que usa xargs interpretará la ruta como varios archivos y generará errores (y causará otros problemas). - paulusdd


Respuestas:


La opción 1 evitará generar procesos externos, lo que es útil en condiciones de estrés.

La opción 2 generará un solo xargs proceso, que engendrará sólo tantos rm Procesos según sea necesario. Esta opción se usa típicamente con -print0 y -0 para manejar nombres de archivos con espacios y / o nuevas líneas.

La opción 3 generará un rm Proceso para cada archivo.

GNU find (o cualquier versión compatible con POSIX) permite una cuarta opción, find .... -exec rm -r {} +, que correrá rm con tantos nombres de archivo como sea posible para generar solo un número limitado de ellos.


15
2017-07-28 13:32



Solo uso el método xargs en la práctica. - Brian Knoblauch


Prefiero usar find ... > file.txt revisa el archivo extensivamente, luego usa find ... -delete así que sé que exactamente los mismos resultados serán eliminados (la mayoría de los argumentos de paso son a prueba de balas).


5
2017-07-28 13:32



Si adopta este enfoque, tenga cuidado con la condición de la carrera. Es decir, la posibilidad de que el contenido del sistema de archivos cambie entre los dos comandos. También el hecho de que en la primera línea de comando, la opción -depth no está en efecto, mientras que está en la segunda (debido a que está implícita en tuend por -delete). - James Youngman


El tema de la eliminación de archivos se aborda en la sección "Limpieza" en la documentación de búsqueda de GNU. Puede leer eso en su sistema usando "info find", o dentro de Emacs. También puedes verlo en línea en http://www.gnu.org/software/findutils/manual/html_node/find_html/Cleaning-Up.html#Cleaning-Up.

find .... -delete

Esta es la opción más segura (contra carreras de enlaces simbólicos) y de alto rendimiento (ya que no hay necesidad de ejecutar nada o de realizar un cambio de contexto cuando el búfer de tubería está lleno). Pero ten en cuenta que -delete implica -de profundidad.

find .... | xargs rm ...

Esto es peligroso en situaciones donde otros tienen acceso de escritura al árbol en el que está realizando la limpieza. Por ejemplo, suponiendo que el comando de búsqueda decidió que /var/tmp/scratch/me/.ssh/config coincide con sus requisitos y, por lo tanto, imprime esos nombres al stdout. El comando xargs lo leerá y lo agregará a una estructura de datos. Poco tiempo después (cuando xargs haya leído el número de bytes indicado por el valor predeterminado de la opción -s), xargs se bifurcará y ejecutará para eliminarlo. Sin embargo, es posible que mientras tanto, alguien más haya hecho esto:

$ cd /var/tmp/scratch
$ mv me me.old
$ ln -s /root me

Luego, cuando rm va a eliminar /var/tmp/scratch/me/.ssh/config, se emitirá la llamada al sistema unlink ("/ var / tmp / scratch / me / .ssh / config"). Debido a que el kernel resolverá el enlace simbólico para usted, esto es equivalente a que llame a unlink ("/ root / .ssh / config"). Si el proceso xargs se estaba ejecutando como root, entonces /root/.ssh/config se eliminará, a pesar del hecho de que no especificó -L en la línea de comandos. Por esta razón, si la seguridad es importante, use -delete. Puede leer más sobre esta área en la sección "Consideraciones de seguridad" del manual de búsqueda de GNU.

find .... -exec rm ...;

Debido a que esto también involucra fork / exec, tiene los mismos problemas de seguridad que mencioné anteriormente.

En resumen, la única razón para no usar -delete es la compatibilidad con sistemas que carecen de soporte para -delete.


2
2018-02-12 15:44