我有一个独立的 Linux 系统、Windows 系统和设备集群,它们都安装了一组远程共享(通过 NFS 和 CIFS)。共享文件系统的操作系统是 Linux。我经常创建新的远程共享,这些共享也会被共享。我对文件权限和所有权有一组特定的要求,我目前使用以下命令(在一个小的 bash 脚本中)来实现这些要求:
find -type d -exec chmod u=rwx {} \;
find -type d -exec chmod go=rx {} \;
find -type f -exec chmod u=rw {} \;
find -type f -exec chmod go=r {} \;
find . -exec chown nobody {} \;
find . -exec chgrp nogroup {} \;
find -name ".*" -exec chown nobody {} \;
find -name ".*" -exec chgrp nogroup {} \;
在大型文件系统上,这需要很长时间。我正在寻找一种可以更快完成此操作的方法。
具体来说:
- 所有文件和目录(包括隐藏的“。”文件和目录)都需要由“nobody”拥有
- 所有文件和目录(包括隐藏的“。”文件和目录)都需要归入“nogroup”组
- 所有文件都需要所有者具有“rw”权限,并且需要组和其他用户具有“r”权限
- 所有目录都需要所有者具有“rwx”权限,并且需要组和其他用户具有“rx”权限
答案1
有一件事可以立即加快该过程,即不在 find 中使用 -exec,而是通过将结果名称传递给 xargs:
find . -type d -print0 | xargs -0 chmod 777
以上只是一个例子,-print0 正确地传递了那些具有奇怪文件名的令人讨厌的文件,并且 xargs 命令上的 -0 参数正确地读取了此输出。
无论如何,上面的命令字符串只会在 find 命令提供最大数量的参数后重复调用一次 chmod,最后一个 chmod 包含剩余的参数。通过不为每个文件生成一个 chmod,您最终可以节省大量时间。
答案2
chown
和都chmod
提供了-R
使递归的选项。这两个命令几乎可以完成您想要的所有操作,而且速度非常快:
chmod -R u=rwX,go=rX *
chown -R nobody:nogroup *
该模式u=rwX
将用户模式设置为读写,并且,在文件/目录已经具有某人的执行权限的情况下,执行。因此,这保留了目录的执行权限,但不会提升其他文件的执行权限,除非它们已经具有该属性。 go=rX
授予组和其他读取权限,并在相同条件下授予执行权限。
该命令chown -R nobody:nogroup *
将递归地将所有文件的所有者更改为 nobody,并将组更改为 nogroup。
这些命令适用于所有递归目录中的隐藏文件。 glob*
不会拾取当前目录中的隐藏文件。 可以通过 (1) 明确指定它们或 (2) 设置 bash 的dotglob
选项来解决这个问题:shopt -s dotglob
。
删除执行权限
如果您有需要删除其执行权限的普通文件,可以采用以下方法加速:
find -type f -executable -exec chmod a-x {} +
因为上面的命令以+
而不是结尾\;
,所以 find 会在命令行上放置尽可能多的文件名chmod
。这大大减少了必须创建进程来运行 的次数chmod
。
此外,该-executable
选项将严格处理的文件名数量减少到需要删除执行权限的文件名数量。