Il tuo comando viene prima analizzato dalla shell in due comandi separati da a ;
, che equivale a una nuova riga:
find . -name "*" -exec chgrp -v new_group {}
chmod -v 770 {} \;
Se vuoi eseguire un comando shell, invoca esplicitamente una shell con bash -c
(o sh -c
se non ti interessa che la shell sia specificamente bash):
find . -name "*" -exec sh -c 'chgrp -v new_group "$0"; chmod -v 770 "$0"' {} \;
Si noti l'uso di {}
come argomento per la shell; è l'argomento zeroth (che normalmente è il nome della shell o dello script, ma qui non importa), quindi indicato come "$0"
.
Puoi passare più nomi di file alla shell alla volta e far scorrere la shell attraverso di essi, sarà più veloce. Qui passo _
come il nome dello script e i seguenti argomenti sono nomi di file, che for x
(una scorciatoia per for x in "$@"
) scorre.
find . -name "*" -exec sh -c 'for x; do chgrp -v new_group "$x"; chmod -v 770 "$x"; done' _ {} +
Nota che da bash 4, o in zsh, non è necessario trovarlo affatto qui. In bash, esegui shopt -s globstar
(mettilo nel tuo ~/.bashrc
) per attivare **/
standing per un glob ricorsivo di directory. (In zsh, questo è sempre attivo.) Quindi
chgrp -v new_group -- **/*; chmod -v 770 -- **/*
o se si desidera che i file vengano ripetuti in ordine
for x in **/*; do
chgrp -v new_group -- "$x"
chmod -v 770 -- "$x"
done
Una differenza con il find
comando è che la shell ignora i file di punti (file il cui nome inizia con a .
). Per includerli, in bash, primo set GLOBIGNORE=.:..
; in zsh, usa **/*(D)
come modello glob.
'{}'
(apostrofi attorno alle parentesi graffe), visita: unix.stackexchange.com/q/8647/4485