通过一个命令将权限和所有者更改为安全资源

通过一个命令将权限和所有者更改为安全资源

我有一个具有以下功能的备份脚本:

function change_rights()
{
    chown -R ${OWNER}:${GROUP} ${DIR}
    find ${DIR} -type f -exec chmod 0640 {} \;
    find ${DIR} -type d -exec chmod 0770 {} \;
}

现在的问题是,这${DIR}是非常巨大的,为了更改所有者和权限,我必须遍历目录至少两次,这是极其资源密集型的。

有什么方法/任何命令可以更改所有者权利同时?也就是说一次性改变了inode里的内容?

我正在研究ext4文件系统。

答案1

除了使用 find 之外,您还可以设置必要的 shell 选项来 glob 隐藏文件并进行递归 globbing,然后执行类似的操作

for entry in ${DIR}/**/**; do
  chown "${OWNER}:${GROUP}" "${entry}"
  if [[ -d "${entry}" ]] ; then
    # do the thing you do on directories
  else
    # do the thing you do on files
fi

但老实说,生成数千个进程而不是遍历两次的开销chown可能不值得;与检查某些内容是否是 shell 逻辑中的文件相同,而不是遍历两次。最后,您必须自己进行基准测试。

我发现find的语法有时有点令人困惑,但以下是对我有用的:

find  \( -exec /usr/bin/echo ${OWNER}:${GROUP} '{}' \; \) \
-a \( \
      \( -type f -exec /usr/bin/echo 0640 '{}' \; \) \
   -o \( -type d -exec /usr/bin/echo 0770 '{}' \; \) \
   \)

一旦您理解其含义,请立即将其替换echochown/ 。chmod

请注意,这里的问题是您在进入目录之前首先更改目录权限 - 如果您之后无法自行读取和列出它,则可能会出错。

非常巨大

如果确实有数百万个文件,那么考虑使用比具有标准设置的 ext4 更适合该用例的东西;老实说,即使对于我收集的源树,事情实际上也不会花费很长时间。

相关内容