我有一个具有以下功能的备份脚本:
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 '{}' \; \) \
\)
一旦您理解其含义,请立即将其替换echo
为chown
/ 。chmod
请注意,这里的问题是您在进入目录之前首先更改目录权限 - 如果您之后无法自行读取和列出它,则可能会出错。
非常巨大
如果确实有数百万个文件,那么考虑使用比具有标准设置的 ext4 更适合该用例的东西;老实说,即使对于我收集的源树,事情实际上也不会花费很长时间。