当不需要更改任何内容时,chown 或 chmod 是否会生成写入请求?

当不需要更改任何内容时,chown 或 chmod 是否会生成写入请求?

当实用程序被指示设置的设置已经是文件所具有的设置时,它们是否会对文件执行实际的写入操作?例如chownchmod

> ls -l 

... gooduser gods ... state_secrets

> chown gooduser:gods state_secrets

我应该用它find来查找需要更改的文件吗,或者只是chmod -R更有效?

答案1

一个好方法是运行 下的命令来查看chown文件的所有权是否真的发生了变化,即使它们保持不变(例如从pduck到) 。这样我们就可以看到实际调用的 API。pduckstrace

我创建了一个由我和我的团队拥有的测试文件。然后我做了一些事,chown pduck:pduck test.txtstrace 前面加上了:

$ touch test.txt
$ ls -l
total 0
-rw-r--r-- 1 pduck pduck 0 Jun 16 12:10 test.txt

$ strace chown pduck:pduck test.txt
execve("/bin/chown", ["chown", "pduck:pduck", "test.txt"], 0x7ffd0309c990 /* 74 vars */) = 0
brk(NULL)                               = 0x5589645df000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
...
newfstatat(AT_FDCWD, "test.txt", {st_mode=S_IFREG|0644, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchownat(AT_FDCWD, "test.txt", 1000, 1000, 0) = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

我们可以看到,所有权确实是无条件的已更改从 pduck:pduck 到 1000:1000(这是 pduck:pduck 的数字 ID)。


您有多种选择:

  • chown --from=pduck:pduck pgoose:pgoose text.txtpgoose:pgoose如果当前 所有权为 ,则仅将其更改为pduck:pduck。其他所有权的文件保持不变。添加-R以递归进行更改。

  • find . -type f -user pduck -group pduck -exec chown pgoose:pgoose {} + 这将(递归地)找到 pduck:pduck 拥有的所有文件,并且只为它们运行chown pgoose:pgoose …

  • find . -type f -not -\( -user pduck -or -group pduck -\) -exec chown pduck:pduck {} + 更改不属于用户pduck或组的文件的所有权pduck

只要您没有数十万个文件,我认为性能不会有太大差别。

我这样做chown -R ...通常是因为整个目录的所有权“错误”(例如在拇指驱动器上)。但我通常绝不因为文件和目录需要不同的权限,并且对他们来说有不同的含义。我们在这里有很多关于如何修复这个可怕的事情的问题。相反,我使用两个单独的命令(和)来执行此操作。chmod -Rxchmod -R 777 …find -type d …find -type f …

相关内容