Ваша команда спочатку розбирається оболонкою на дві команди, розділені знаком a ;, що еквівалентно новому рядку:
find . -name "*" -exec chgrp -v new_group {}
chmod -v 770 {} \;
Якщо ви хочете запустити команду оболонки, явно викликайте оболонку з bash -c(або sh -cякщо вам не байдуже, що оболонка конкретно баш):
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команди є те, що оболонка ігнорує крапкові файли (файли, назва яких починається з а .). Щоб включити їх у bash, перший набір GLOBIGNORE=.:..; в zsh, використовувати **/*(D)як глобус.
'{}'(апострофи навколо брекетів), відвідайте: unix.stackexchange.com/q/8647/4485