chown -R root:root .* 在 /root 上执行 chown

chown -R root:root .* 在 /root 上执行 chown

当从 /root 运行标题中的命令时,它会以某种方式跳转到 / 并更改所有文件的所有权,我之所以注意到这一点,是因为 /proc 的错误消息弹出了。

也许我老了,但 . 和 .. 不应该被任何命令忽略吗?据我所知,它们是因为文件系统而存在的,没有其他用途。

运行 Debian Wheezy 并应用最新更新。

答案1

也许我老了,但 . 和 .. 不应该被任何命令忽略吗?据我所知,它们是因为文件系统而存在的,没有其他用途。

这毫无意义,因为你特意用 来输入名字...chown chown <...> .*。在这种情况下,为什么认为chown你没有做你想做的事?

这些名称被提供给 chown,因为 shell 根据您为其提供的 shell glob 扩展条件扩展了它们,该条件与当前目录中的所有其他点目录相匹配...由于您指示chown以递归方式工作,因此它会深入到这些目录以及它们下面的任何目录。这意味着它“深入到”..然后从那里继续工作。

您可以自己尝试一下,echo .*看看输入到 chown 命令行中的名称。将echo *其与shopt dotglobon 和 off 的输出(分别shopt -s dotglob用于打开和shopt -u dotglob关闭)进行比较。使用ls而不是echo查看第一级递归。

有充分的理由甚至在或chown -R上运行。最明显的做法似乎是提取一个档案,该档案包含错误的文件所有权信息以及单个目录中的所有文件;在这种情况下,从未压缩的目录中执行的操作是完全合理的,将所有权重置为系统上的合理内容。...chown -R abc:xyz .

如果您希望 shell 不扩展.*...那么您需要确保它为您的特定 shell 正确设置。例如,引用 GNU bash 4.2.37(1)-release(撰写本文时 Debian Wheezy 上的最新版本,amd64 架构上的 Debianbash软件包版本4.2+dfsg-0.1+deb7u3)手册页:

格洛比格诺尔
用冒号分隔的模式列表,定义路径名扩展要忽略的文件名集。如果与路径名扩展模式匹配的文件名也与 GLOBIGNORE 中的某个模式匹配,则会将其从匹配列表中删除。

请记住,Unix 哲学的一部分是“相信用户知道他们在做什么”。

答案2

  1. 点 (.) 不能被忽略,因为是当前目录
  2. 双点 (..)(上层目录)不会被忽略,因为它与通配符匹配

但如果你以这种方式执行,你将不会得到这样的效果

chown -R root:root *

如果您只想更改隐藏文件、目录,请尝试以下操作:

find . -regex '.*/\..*' -exec chown root:root {} \;

相关内容