En cuanto al find
comando, también puede agregar más -exec
comandos 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 find
parámetros 's tales como -name
, -exec
, -size
etc., son en realidad pone a prueba : find
se continuará ejecutando uno por uno, siempre y cuando toda la cadena hasta el momento ha evaluado a verdadera . Por lo tanto, cada -exec
comando consecutivo se ejecuta solo si los anteriores devuelven verdadero (es decir, el 0
estado de salida de los comandos). Pero find
también comprende operadores lógicos como or ( -o
) y not ( !
). Por lo tanto, para usar una cadena de -exec
pruebas 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
-c
manejo 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 -c
si 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
find
comando 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
.