2009-03-22 11 views
10

El comando find parece diferir de otros comandos de Unix.No se puede comprender la sintaxis del comando find

¿Por qué hay llaves vacías y un flash hacia atrás al final del siguiente comando?

find * -perm 777 -exec chmod 770 {} \; 

He encontrado una razón para las llaves, pero no para el flash hacia atrás.

Las llaves son al parecer por el camino

Igual que -exec, excepto que `` {} '' es reemplazado con tantos nombres de ruta como posible para cada invocación de utilidad

+2

Las llaves también le permiten ejecutar comandos que no esperan (o requieren) el nombre del archivo a ser el último argumento. Puedes usar los frenos para insertar el nombre del archivo donde quieras, ¡incluso como el nombre del programa para ejecutar! –

+0

posible duplicado de [Comando simple de Unix, ¿cuál es el {} y \; para] (http://stackoverflow.com/questions/447048/simple-unix-command-what-is-the-and-for) – kenorb

Respuesta

2

lo recomiendo que en vez de que lo hace como

find . -perm 777 -print0 | xargs -0 chmod 770 

"xargs" dice que tomar los resultados del hallazgo y alimentarlo 20 a la vez para el siguiente comando.

+1

Veinte a la vez? ¿Dice quién? –

+0

man xargs (de la versión 4.4.0) no menciona el número 20. Sin embargo, este comportamiento se puede aplicar llamando a xargs con -n20. – Stephan202

+0

"20 a la vez" era una especie de promedio. En realidad, es mucho lo que cree que puede caber en una línea de comando normal, que creo que tiene una longitud de 512 bytes en POSIX. –

16

El comando -exec puede ir seguido de cualquier número de argumentos que componen el comando que se va a ejecutar para cada archivo encontrado. Debe haber alguna forma de identificar el último argumento. Esto es lo que \; hace. Tenga en cuenta que otras cosas pueden seguir después de que el interruptor de -exec: (. Esto encuentra todos los archivos y los archivos de c pitón en el directorio de Euler)

find euler/ -iname "*.c*" -exec echo {} \; -or -iname "*.py" -exec echo {} \; 

La razón de que Exec no requiere el comando completo a estar dentro de las comillas, es que esto requeriría escapar muchas citas dentro del comando, en la mayoría de las circunstancias.

3

El punto y coma (escapado) es necesario para que "encontrar" pueda indicar dónde terminan los argumentos para el programa ejecutado (si hay alguno) y comienzan los argumentos adicionales para "buscar".

Cuestiones relacionadas