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
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.
-delete
modificador antes de-name
borra el árbol de archivos especificado , así que supongo que debo tener cuidado.find
recientes, puede usar-exec rm {} +
para eliminar todas las coincidencias archivos con un solo comandorm
..DS_Store
doesn ' t contienen caracteres especiales, por lo que las comillas son innecesarias y no cambian nada en este caso.;
o|
o>
o<
y « y muchos otros que tienen un significado especial para el shell a menos que se citen.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.