Ваша команда спочатку розбирається оболонкою на дві команди, розділені знаком 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