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