Estoy tratando de entender la diferencia entre estos dos comandos:

sudo find / -name .DS_Store -delete 

y

sudo find / -name ".DS_Store" -exec rm {} \; 

Noté que el -exec ... {}. ¿Por qué? ¿Cuál es más seguro / más rápido / mejor? He utilizado ambos en mi Macbook y todo parece funcionar bien.

Answer

-delete funcionará mejor porque no tiene que generar un proceso externo para cada y cada archivo coincidente.

Es posible que vea -exec rm {} \; recomendado a menudo porque -delete no existe en todas las versiones de find. No puedo comprobarlo en este momento, pero estoy bastante seguro de que he utilizado un find sin él.

B otros métodos deben ser «seguros».

EDIT por comentario de @doitmyway: asegúrese de coincidir en el nombre y luego eliminar, no al revés (eliminar, luego hacer coincidir). De lo contrario, se eliminarán todos los archivos, coincidan o no . Es decir, NO haga esto: find / -delete -name .DS_Store.

Un método común para evitar la sobrecarga de generar un proceso externo para cada archivo coincidente es:

find / -name .DS_Store -print0 | xargs -0 rm 

(pero tenga en cuenta que aquí también hay un problema de portabilidad: no todas las versiones de find tienen -print0!)

Comentarios

  • Ya veo. ' también leí que el uso del -delete modificador antes de -name borra el árbol de archivos especificado , así que supongo que debo tener cuidado.
  • En find recientes, puede usar -exec rm {} + para eliminar todas las coincidencias archivos con un solo comando rm.
  • .DS_Store doesn ' t contienen caracteres especiales, por lo que las comillas son innecesarias y no cambian nada en este caso.
  • Básicamente, solo los espacios en blanco (espacios, tabulaciones, quizás otros) es lo único que hace que una cadena sin comillas se interprete como dos argumentos de línea de comando separados, pero eso ' no es todo lo que tiene que lamentar al decidir si citar o no. Tienes que preocuparte por todos metacaracteres de shell como ; o | o > o < y « y muchos otros que tienen un significado especial para el shell a menos que se citen.
  • @MarcoMarsala xargs se encarga del problema de la lista de argumentos de tamaño limitado de forma transparente dividiéndola en múltiples invocaciones del comando.

Responder

Suponiendo que .DS_Store represente archivos y no directorios, la forma más portátil y rápida de hacerlo sería:

sudo find / -name .DS_Store -exec rm {} + 

El único riesgo es que sudo no esté disponible, pero hoy en día es bastante bajo.

El -delete opción utilizada para exigir la búsqueda de GNU y todavía no es estándar en muchas otras find implementaciones, por lo que no siempre está disponible.

La terminación del comando + en en lugar de \; optimiza en gran medida la cláusula exec al no ejecutar el comando rm para cada y cada .DS_Store presente en el sistema de archivos.

Respuesta

Para una máquina como como su macbook, no encontrará mucha diferencia en el rendimiento entre los dos comandos. Sin embargo, si observa la versión -exec, puede ver una sutil diferencia:

sudo find / -iname ".file-to-delete" -exec rm {} \; 

Esto significa que encontrará todos esos archivos con el nombre «.file -borrar». Sin embargo, esta búsqueda puede devolver algunos falsos positivos no deseados. Al hacer algo con sudo, debes tener un poco más de cuidado. La ventaja de usar -exec rm {} es que puede pasar argumentos a rm de esta manera:

sudo find / -iname "*~" -exec rm -i {} \; 

En este ejemplo, quiero eliminar los archivos de respaldo que emacs hace. Sin embargo, esa tilde podría estar en algún archivo oscuro que no conozco y podría ser importante. Además, quiero confirmar la eliminación. Así que puse la opción «-i» en el comando rm. Esto me dará una eliminación interactiva .

También puede refinar el uso de rm para eliminar directorios y archivos:

find /usr/local/share/ -iname "useless" -exec rm -r {} \; 

En resumen, el -exec da tienes un poco más de control sobre el comando real que elimina el elemento encontrado La ventaja es que usas una herramienta para encontrar los archivos, otra herramienta para eliminarlos.Además, no todas las versiones de la utilidad de búsqueda tienen la opción -delete. Así que es mejor usar cada herramienta para su trabajo adecuado. Esta es la filosofía de Unix: una herramienta, un trabajo, utilícelos juntos para hacer lo que necesita hacer.

Comentarios

  • Vea también -ok rm {} \; en lugar de -exec rm {} \; para confirmación interactiva.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *