chown -R user:user .* 反向更改权限:这是正确的行为吗?

我在更改位于/的文件夹myfolder的权限时遇到了很多麻烦。 我执行了以下命令:
sudo chown -R luca:luca /myfolder/.*

我的意图是更改所有隐藏文件在/myfolder目录下的所有权。
不幸的是,我意识到根目录/的所有权也被改变了,这自然导致了系统出现故障。我认为这是因为..匹配了.*,但对我来说仍然很奇怪。
修改父目录的行为是正确的吗?还是我应该报告一个错误?
如果是我在使用chown时犯了错误,有什么最佳实践可以避免更改系统文件和文件夹的所有权呢?

4这是预期的行为,因为 .. 匹配 .* - Uwe Plonus
.* 表示以 . 结尾的任意文件。 *. 表示以 . 开头的任意文件。 - NickTux
4@NikTh 这是相反的情况! - Uwe Plonus
一个最佳实践可能是除非绝对必要(提出问题以了解您想要实现的目标),否则不直接修改/(创建文件夹、删除等)。此外,使用通配符+根权限是危险的,因为往往您无法百分之百确定通配符会影响到什么。 - edwin
@Lekensteyn没有关联。我想要更改所有隐藏文件和文件夹的所有权(而不是修改)。仅限隐藏文件和文件夹,不包括所有文件。 - lucacerone
1@LucaCerone 它们有关联,chmodchown是类似的命令,都以ch开头,包含一个o,并且还有另外两个相似的字母(nm)。</literal> 说真的,它们都是以下形式:[命令] -R [模式或用户名] [一个或多个文件]。在该问题中提供的一些解决方案也适用于你的情况,例如Sean Reifschneider的这个回答(在中间)。这个回答也适用于仅隐藏文件,只需删除非隐藏文件的通配符即可。 - Lekensteyn
@Lekensteyn 谢谢你提供的链接,(我不知道 shopt..)不过我仍然认为 AskUbuntu 的目的是为新手提供帮助,他们可能不知道 chown 和 chmod 具有相同的语法 :)(我今天才发现的 :)) - lucacerone
@LucaCerone 顺便说一下,那个链接是来自Serverfault.com的;有时候我会因为相似性而错误地运行chmod 0:0 [file],而应该是chown 0:0。你想知道0:0是什么意思吗?RTFM!:D - Lekensteyn
2个回答

请记住,在执行之前,命令行会被shell解释和扩展。
sudo chown -R luca:luca /myfolder/.*

首先将其解释为:
sudo chown -R luca:luca /myfolder/.  /myfolder/.. /myfolder/.adobe  /myfolder/.bash_history

请注意在命令行中的/myfolder/..chown -R luca:luca /myfolder/.. 等同于 chown -R luca:luca /, 这使得 chown 命令“反向”运行。
当使用 "*" 来验证时,请使用 echo /myfolder/.*

@Emmanuel:为什么你要使用xargs和find命令,当只用-R选项就足够了呢? - January
@Emmanuel:谢谢!你能详细解释一下find和xargs吗? - lucacerone
@LucaCerone 我不确定你为什么接受了这个方法,它会 递归地 更改 /myfolder 中的 所有 文件。find 命令是多余的,并且在文件名中包含空格时会出错。(如果你想要递归地更改文件,find /myfolder | xargs chown luca:lucachown -R luca:luca /myfolder 类似)。 - Lekensteyn
Lekensteyn 是对的,我忘了使用 grep ^。 - Emmanuel
@Lekensteyn 我把查找的匹配改成了不匹配空格。 - Emmanuel
@LucaCerone 修改已完成 - Emmanuel
@January,find命令本身可以让你首先检查是否修改了你想要的文件,然后你可以将find命令与xargs命令进行管道连接。 - Emmanuel
@Lekensteyn,我投了一票,因为它清楚地解释了文件名如何扩展...帮助我理解了出错的原因。 - lucacerone

嗯。以root身份的命令行非常强大。阅读一些经典的这些文献。是的,.*匹配到..正是预期的结果。点并不是一个特殊字符,而是一种约定。按照约定,以点开头的文件在默认视图中被隐藏,当列出目录时——没有多余的含义。按照约定,指向当前目录的inode被命名为.,指向父目录的inode被命名为..
你应该做的是
chown -R luca:luca /myfolder

我有没有提到以点开头的文件名没有什么特别之处?递归的chown命令并不这样认为。
现在,你可能可以通过将所有权改回root来恢复一些功能。从长远来看,你可能需要重新安装系统。
作为一个通则:
1. 避免以root身份工作。 2. 如果你以root身份工作,在按下Enter键之前,请仔细阅读每个命令两次。 3. 如果你对扩展不确定,先用一个“安全”的命令尝试一下(比如echo .*)。 4. 不要以root身份工作。 5. 有许多任务可以使用图形界面安全地执行(你的问题就是这样一个例子)。 6. 我有没有提到你应该避免使用root账户?

我不想改变文件夹中所有文件的所有权...只是隐藏文件的所有权。 - lucacerone
2好的,那是我的错。在这种情况下,我认为应该使用chown -R luca:luca /myfolder/.[^.]* - January
2echo .* 是一个很好的尝试扩展的方法。它会准确地显示出shell所看到的内容。ls .* 可能会更加令人困惑,因为它会进入子目录(也许使用 ls -d .* 会更好,但还是可以直接使用 echo .*)。 - Robie Basak
@RobieBasak 说得好! - January