递归更改所有者/组的更快方法?

dan*_*nzo 30 linux command-line shell terminal chown

目前,当我想递归更改所有者/组时,我这样做:

find . -type f -exec chown <owner>.<group> {} \;
find . -type d -exec chown <owner>.<group> {} \;
Run Code Online (Sandbox Code Playgroud)

但是对于每个命令,这可能需要几分钟时间。我听说有一种方法可以做到这一点,它可以一次更改所有文件(更快),而不是一次更改一个,但我似乎找不到相关信息。可以做到吗?

Ste*_*itt 48

使用chown的递归选项:

chown -R owner:group * .[^.]*
Run Code Online (Sandbox Code Playgroud)

指定两者*.[^.]*将匹配所有文件和目录find。现在推荐的分隔符是:而不是.. (正如justins所指出的, using.*是不安全的,因为它可以扩展为包含.and ..,从而导致chown更改父目录及其所有子目录的所有权。)

如果你也想改变当前目录的所有权,这可以简化为

chown -R owner:group .
Run Code Online (Sandbox Code Playgroud)


Ant*_*hon 7

对于像chown这样有自己递归的命令,使用该选项最快:

 chown -R owner:group * .[^.]*
Run Code Online (Sandbox Code Playgroud)

警告!在某些 shell 中,表单会chown -R owner:group * .*替换根目录 / 中的所有者。因为.*意味着../../../../root, ../bin ... etc。所有路径。但是,最广泛使用的 shell bash并不适用...扩展模式。

但是,了解减慢您使用速度的主要问题find是您chmown对找到的每个目录和文件进行调用是很有用的。使用起来要快得多:

find . -type f -exec chown <owner>:<group> {} +
find . -type d -exec chown <owner>:<group> {} +
Run Code Online (Sandbox Code Playgroud)

因为每次chown都使用命令行上适合的尽可能多的参数调用。

该更改也适用于其他没有内置递归选项chown(如 )的命令。它在有这样一个递归选项但你不能使用它的情况下工作(并提高速度)(例如,当使用chmod,并且你只想更改目录时)。