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

Bar*_*ino 2 filesystem permissions chown

当实用程序chown被chmod指示设置的设置已经是文件所具有的设置时,它们是否会实际写入文件?例如:

> ls -l 

... gooduser gods ... state_secrets

> chown gooduser:gods state_secrets
Run Code Online (Sandbox Code Playgroud)

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

Per*_*uck 5

一个很好的方法来查明是否chown确实更改了文件的所有权,即使它们保持不变(例如从pduck到pduck),也可以在 下运行命令strace。这样我们就可以看到实际被调用的 API。

\n\n

我创建了一个由我和我的团队拥有的测试文件。\n然后我做了chown pduck:pduck test.txt,但strace前面加上了\n:

\n\n
$ touch test.txt\n$ ls -l\ntotal 0\n-rw-r--r-- 1 pduck pduck 0 Jun 16 12:10 test.txt\n\n$ strace chown pduck:pduck test.txt\nexecve("/bin/chown", ["chown", "pduck:pduck", "test.txt"], 0x7ffd0309c990 /* 74 vars */) = 0\nbrk(NULL)                               = 0x5589645df000\naccess("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)\naccess("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)\n...\nnewfstatat(AT_FDCWD, "test.txt", {st_mode=S_IFREG|0644, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0\nfchownat(AT_FDCWD, "test.txt", 1000, 1000, 0) = 0\nclose(1)                                = 0\nclose(2)                                = 0\nexit_group(0)                           = ?\n+++ exited with 0 +++\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如我们所看到的,所有权确实无条件地从 \npduck:pduck更改为 1000:1000(这是 pduck:pduck 的数字 ID)。

\n\n
\n\n

您有多种选择:

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

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

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

  • \n
\n\n

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

\n\n

当我chown -R ...这样做时,通常是因为整个目录具有“错误”的所有权\n(例如在拇指驱动器上)。但我通常从不这样做,因为文件\n和目录需要不同的权限,并且对它们有不同的含义。\n我们在这里有很多关于如何解决这个可怕的问题的问题。\n相反,我用两个单独的命令(和)来执行此操作。chmod -Rxchmod -R 777 \xe2\x80\xa6find -type d \xe2\x80\xa6find -type f \xe2\x80\xa6

\n