我有一个非常简单的任务:更改位于特定文件夹中的所有文件的权限:
find in_this_directory -type f -exec sudo chmod 0664 {} \;
虽然这有效,但它会调用sudo
每一个镜头,这会对我的系统产生巨大影响,因为journalctl 会记录所有 sudo 访问:
mycomp sudo[20047]: pam_unix(sudo:session): session closed for user root
如果有一百万个文件,上面的这条线会出现一百万次in_this_directory
。
我可以
sudo find in_this_directory -type f -exec chmod 0664 {} \;
但是这个会做其他事情,并且在要更改的文件没有0777并且不属于当前用户的第一次拍摄时会失败。
有没有比等待这些sudo操作结束更好的解决方案?
sudo find ... -exec chmod
通常会达到同样的效果。sudo 授予的权限是可继承的,因为它只是使进程作为始终被继承的不同用户(通常是 UID 0)运行。唯一表现不同的情况是:a)您的普通用户无权进入某些子目录(在这种情况下
sudo find
仍会进入它们),或者 b)您使用的条件-readable
取决于当前用户标识符。对于
chmod
接受多个文件名作为最后一个参数的所有其他命令,GNU find 支持+
终止符,它将一次运行带有尽可能多文件的命令:(对于不支持这个扩展的操作系统,
xargs
可以做同样的事情,但是处理带有空格的文件名有点困难——通常-print0
或者xargs -d
也不会在这样的系统上工作。)