Ваша команда сначала анализируется оболочкой на две команды, разделенные ;
символом 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