Creo que estoy bastante avanzado en mi uso de find, pero CADA vez que lo uso no puedo recordar toda la vida el método para cerrar la opción -exec. Paso mucho tiempo leyendo cada vez que lo uso. ¿Simplemente no lo estoy usando lo suficiente o espero demasiado de mí mismo? Comencemos con un ejemplo típico que me frustra.
La estructura del directorio tiene archivos con todos los permisos incorrectos, archivos ocultos, enlaces simbólicos, etc. Quiero cambiar la propiedad a un valor razonable
find . -type f -exec chown username {} \;
find . -type d -exec chown username {} \;
find . -type d -exec chgrp usergroup {} \;
find . -type f -exec chgrp usergroup {} \;
(Perdóname si el final es al revés ... Lo miré hace una hora y aún no estoy seguro)
Pero tengo miedo de ejecutarlo debido a monturas, enlaces simbólicos, etc. He hecho el mejor truco de chmod. * Y tuve que recurrir hacia arriba antes. Sé que -xdev renunciará a cruzar particiones, pero no estoy seguro de qué pasará con los archivos que se encuentran dentro de directorios que son enlaces simbólicos.
Entonces, ¿cómo se domina a esta bestia que puede matar archivos cruciales?
Actualice podando las mejores sugerencias a continuación y resumiendo:
- Tener un directorio de práctica vinculado y montado a otros directorios de práctica.
- Use xargs en lugar del comando exec no intuitivo.
- Use -exec echo {} por cordura y seguridad
- El punto y coma es especial y estás escapando, por lo tanto, el personaje de escape es el primero
- El comando -o puede ayudarlo a combinar criterios de selección.
Estoy un poco confundido acerca de print0 pero xargs siempre ha estado un poco en la práctica no fácil de entender a primera vista que intento evitar.
fuente
Respuestas:
Bueno, en lo que respecta a la
-exec
sintaxis, podrías hacer que te guste mucha gente, rendirte y usarxargs
:(o la versión segura de files-with-spaces-and-other-nonsense-in-them-safe)
O, para tratar de recordar lo que debe hacer con el punto y coma, lo que necesita perforar en su cabeza es que está usando un punto y coma para terminar el comando que se
-exec
está ejecutando, y debe escapar del punto y coma porque tiene un punto y coma especial. es decir, abash
. Es por eso que es una barra invertida de punto y coma. Parece que la{}
parte de sustitución está bien.En cuanto a eliminar archivos, etc., si está ejecutando algo grande y peligroso como lo que está hablando, primero haga esto:
y revisar los resultados. Esto es básicamente una "ejecución en seco" en la que está viendo los comandos que se ejecutarían si lo dejara. Definitivamente una buena práctica. No ayudará con el
.*
problema, pero sabes que no debes hacer eso ahora. :)fuente
Me sorprende que nadie haya mencionado la siguiente opción:
Esta sintaxis confirmará el comando antes de ejecutarlo. Funciona mejor si espera que su coincidencia sea un número relativamente pequeño de archivos porque solicitará cada uno.
Algunas respuestas mencionan
xargs
, pero con GNU también es innecesario:Tenga en cuenta que el + normalmente no necesita escapar, pero es bueno adquirir el hábito de hacerlo de todos modos.
fuente
Para eso está man: para los miembros puede ser difícil recordar cosas, por eso el comando * nix incluye páginas man. Usted sólo puede comprobar siempre la sección de acción de la página del manual de un recordatorio sobre la sintaxis:
man find
. Si bien las páginas de manual pueden parecer poco amigables, una vez que sea bueno para leerlas, son muy útiles.Hacer un Front-End o Wrapper: cuando quería mejorar en GNU find, escribí un GUI front-end para find que genera comandos de búsqueda con python, glade y pygtk. Este es un buen ejercicio si quieres conocerlo realmente bien.
Tenga un directorio de práctica: por último, siempre tengo un directorio 'scrap' en mi directorio de inicio para jugar con comandos poderosos cuando algo como 'echo' no lo corta. Puede usar la expansión de shell para crear rápidamente un montón de archivos con algo como:
fuente
También puede combinar expresiones de búsqueda con los operadores '-y' y '-o'. -y está implícito:
es lo mismo que
El operador o puede reducir su lista de 4 comandos a 2:
Y finalmente, no está relacionado con encontrar, pero chown también puede establecer el grupo también. Entonces, lidiando con espacios en los nombres también terminamos con:
fuente
Al cerrar, solo pienso en usar; como con muchos lenguajes de programación y luego escapar. Solo recuerda que es necesario escapar y se te ocurre con bastante facilidad.
fuente
Dependiendo de la versión de find que esté utilizando, hay diferentes opciones que pueden ayudarlo. GNU find es probablemente el más poderoso y esto puede ayudarlo con su segunda pregunta (implícita)
Por ejemplo, el comportamiento predeterminado no es desreferenciar enlaces simbólicos, pero puede anular eso; y la opción -mount detiene la búsqueda de puntos de montaje
Busque en sus páginas de manual locales
fuente
Algunos argumentarían que la opción xargs es más rápida que la opción -exec porque no ejecutará el comando una vez para cada archivo, pero no me preocuparía por eso, excepto por trabajos masivos que requieren una cantidad de tiempo no trivial.
Personalmente, generalmente ejecuto find sin ejecutivo
asegúrese de que el resultado se vea correcto y luego ejecute mi comando en esa lista.
fuente
Para algunos shells (no bash), escape {} para un comportamiento adecuado.
encontrar manual es bueno para dominar find.
fuente
Antes de hacer algo como esto, asegúrese de que el directorio en el que ejecuta este comando no esté en el mismo sistema de archivos que / usr o / etc. (de lo contrario, si tengo un enlace rígido a / etc / passwd o a / bin / sh en mi directorio de inicio, me acaba de otorgar la propiedad de esos y, como efecto secundario, ahora soy el propietario de la máquina).
Si desea recurrir a través de un directorio y compartir todos los archivos / directorios, un simple
chown -Rh usuario: usuario de grupo de usuarios /
lo haré. Hacer seguro utiliza el -H o chown seguirá los enlaces simbólicos.
fuente