El comando analiza primero su comando en dos comandos separados por a ;
, que es equivalente a una nueva línea:
find . -name "*" -exec chgrp -v new_group {}
chmod -v 770 {} \;
Si desea ejecutar un comando de shell, invoque un shell explícitamente con bash -c
(o sh -c
si no le importa que el shell sea específicamente bash):
find . -name "*" -exec sh -c 'chgrp -v new_group "$0"; chmod -v 770 "$0"' {} \;
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, que for x
(un atajo para for x in "$@"
) itera.
find . -name "*" -exec sh -c 'for x; do chgrp -v new_group "$x"; chmod -v 770 "$x"; done' _ {} +
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). Luego
chgrp -v new_group -- **/*; chmod -v 770 -- **/*
o si desea que los archivos se repitan en orden
for x in **/*; do
chgrp -v new_group -- "$x"
chmod -v 770 -- "$x"
done
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 set GLOBIGNORE=.:..
; en zsh, úsalo **/*(D)
como patrón glob.
'{}'
(apóstrofos alrededor de las llaves), visite: unix.stackexchange.com/q/8647/4485