Answers:
至于find
命令,您也可以-exec
连续添加更多命令:
find . -name "*" -exec chgrp -v new_group '{}' \; -exec chmod -v 770 '{}' \;
请注意,此命令的结果等同于使用
chgrp -v new_group文件&& chmod -v 770文件
在每个文件上。
所有find
的参数,如-name
,-exec
,-size
等等,其实都是测试:find
将继续由一个只要运行它们作为一个整个链条迄今已评估为真。因此,仅当先前的-exec
命令返回true(即命令的退出状态)时,才执行每个连续的命令。但也了解逻辑运算符,例如或()而不是()。因此,要使用一连串的测试而不考虑先前的结果,则需要使用以下内容:0
find
-o
!
-exec
find . -name "*" \( -exec chgrp -v new_group {} \; -o -exec chmod -v 770 {} \; \)
find . -name "*" -exec sh -c 'chgrp -v new_group "$0" ; chmod -v 770 "$0"' {} \;
-c
奇怪地处理$ 0 的奇迹使我每次看一眼都认为这是错误的,但它绝对正确。
首先,shell将您的命令解析为两个命令;
,并用分隔,这等效于换行符:
find . -name "*" -exec chgrp -v new_group {}
chmod -v 770 {} \;
如果要运行shell命令,请使用显式调用shell bash -c
(或者sh -c
如果您不关心该shell是否专门为bash):
find . -name "*" -exec sh -c 'chgrp -v new_group "$0"; chmod -v 770 "$0"' {} \;
请注意使用{}
作为shell的参数;它是第零个参数(通常是shell或脚本的名称,但这在这里无关紧要),因此称为"$0"
。
您可以一次将多个文件名传递给Shell,并使Shell遍历它们,这样会更快。在这里,我通过_
了脚本名称,以下参数是文件名,这些文件名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
)以激活**/
递归目录glob的身份。(在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)
用作全局模式。
'{}'
(括号内的撇号),请访问:unix.stackexchange.com/q/8647/4485