我有一个非常简单的任务:更改位于特定文件夹中的所有文件的权限:
find in_this_directory -type f -exec sudo chmod 0664 {} \;
虽然这种方法有效,但它要求sudo
每次击球,这对我的系统产生了巨大的影响,因为日志控制记录所有 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并且不属于当前用户。
除了等待这些,还有什么更好的解决方案吗?须藤操作要结束了吗?
答案1
sudo find ... -exec chmod
通常会实现相同的目的。 sudo 授予的权限是可继承的,因为它所做的只是让进程以不同的用户(通常是 UID 0)的身份运行,并且该权限始终是可继承的。
唯一会出现不同行为的情况是:a)普通用户没有权限进入某些子目录(在这种情况下sudo find
仍会进入这些子目录),或者b)您使用的条件-readable
取决于当前的 UID。
对于chmod
所有其他接受多个文件名作为最后一个参数的命令,GNU find 支持+
终止符,它将同时使用尽可能多的文件运行该命令:
find ... -exec chmod 0664 {} +
(对于不支持此扩展的操作系统,xargs
可以做同样的事情,但处理带有空格的文件名有点困难 - 通常-print0
或xargs -d
在这样的系统上也不起作用。)