Ваша команда сначала анализируется оболочкой на две команды, разделенные ;символом a , что эквивалентно переводу строки:
find . -name "*" -exec chgrp -v new_group {}
chmod -v 770 {} \;
Если вы хотите запустить команду оболочки, вызовите оболочку явно с помощью bash -c(или sh -cесли вам не важно, что оболочка специально bash):
find . -name "*" -exec sh -c 'chgrp -v new_group "$0"; chmod -v 770 "$0"' {} \;
Обратите внимание на использование {}в качестве аргумента оболочки; это нулевой аргумент (обычно это имя оболочки или скрипта, но здесь это не имеет значения), поэтому на него ссылаются как "$0".
Вы можете передавать несколько имен файлов в оболочку за раз и заставлять оболочку проходить через них, это будет быстрее. Здесь я _передаю имя сценария, а следующие аргументы являются именами файлов, которые for x(ярлык для for x in "$@") повторяется.
find . -name "*" -exec sh -c 'for x; do chgrp -v new_group "$x"; chmod -v 770 "$x"; done' _ {} +
Обратите внимание, что начиная с bash 4 или zsh, вам вообще не нужно искать здесь. В bash запустите shopt -s globstar(поместите в свой ~/.bashrc), чтобы активировать **/стоящий за рекурсивный глобус каталога. (В Zsh это активно все время.) Тогда
chgrp -v new_group -- **/*; chmod -v 770 -- **/*
или если вы хотите, чтобы файлы были перебраны в порядке
for x in **/*; do
chgrp -v new_group -- "$x"
chmod -v 770 -- "$x"
done
Одно из отличий findкоманды заключается в том, что оболочка игнорирует точечные файлы (файлы, имя которых начинается с a .). Чтобы включить их, в bash, первый набор GLOBIGNORE=.:..; в zsh используйте **/*(D)в качестве шаблона glob.
'{}'(апострофы вокруг скобок), пожалуйста, посетите: unix.stackexchange.com/q/8647/4485