En cuanto al findcomando, también puede agregar más -execcomandos seguidos:
find . -name "*" -exec chgrp -v new_group '{}' \; -exec chmod -v 770 '{}' \;
Tenga en cuenta que este comando es, en su resultado, equivalente a usar
archivo chgrp -v nuevo_grupo && archivo chmod -v 770
en cada archivo
Todos los findparámetros 's tales como -name, -exec, -sizeetc., son en realidad pone a prueba : findse continuará ejecutando uno por uno, siempre y cuando toda la cadena hasta el momento ha evaluado a verdadera . Por lo tanto, cada -execcomando consecutivo se ejecuta solo si los anteriores devuelven verdadero (es decir, el 0estado de salida de los comandos). Pero findtambién comprende operadores lógicos como or ( -o) y not ( !). Por lo tanto, para usar una cadena de -execpruebas independientemente de los resultados anteriores, uno debería usar algo como esto:
find . -name "*" \( -exec chgrp -v new_group {} \; -o -exec chmod -v 770 {} \; \)
'{}'(apóstrofos alrededor de las llaves), visite: unix.stackexchange.com/q/8647/4485fuente
-cmanejo extraño de $ 0 me hacen pensar que esto está mal cada vez que lo miro, pero definitivamente es correcto.sh -c.El comando analiza primero su comando en dos comandos separados por a
;, que es equivalente a una nueva línea:Si desea ejecutar un comando de shell, invoque un shell explícitamente con
bash -c(osh -csi no le importa que el shell sea específicamente bash):Tenga en cuenta el uso de
{}como argumento para el shell; es el argumento cero (que normalmente es el nombre del shell o script, pero esto no importa aquí), por lo tanto, se hace referencia a él como"$0".Puede pasar varios nombres de archivo al shell a la vez y hacer que el shell los repita, será más rápido. Aquí paso
_como el nombre del script y los siguientes argumentos son nombres de archivo, quefor x(un atajo parafor x in "$@") itera.Tenga en cuenta que desde bash 4, o en zsh, no necesita encontrar nada aquí. En bash, ejecuta
shopt -s globstar(ponlo en tu~/.bashrc) para activar la**/posición de un globo de directorio recursivo. (En zsh, esto está activo todo el tiempo). Luegoo si desea que los archivos se repitan en orden
Una diferencia con el
findcomando es que el shell ignora los archivos de puntos (archivos cuyo nombre comienza con a.). Para incluirlos, en bash, primer setGLOBIGNORE=.:..; en zsh, úsalo**/*(D)como patrón glob.fuente
sh -c.