chown 目录内容的最简单方法?

chown 目录内容的最简单方法?

我经常使用

ls -ld .
# remember current user and group
chown -R user.group .
chown remembered_user.remembered_group .

是否有一种更简单的方法来递归地 chown 目录中的所有文件和目录而不是目录本身?它应该包含隐藏文件并且无论有多少文件都可以工作。

答案1

您可以使用find来避免参数列表太长,同时仍然chown一次性传递尽可能多的参数(使用+而不是;)。-prune允许您删除一些不需要的参数chown(它不会下降目录,它只会chown -R在它们上使用):

find . \! -iname . -prune -exec chown -R user:group {} +

答案2

为什么不直接chown在目录中递归运行呢?

$ chown -R user.group *

例子

.之前的目录。

$ ll
total 20
drwxrwxr-x. 2 saml saml 4096 Apr  9 22:30 dir1
drwxrwxr-x. 2 saml saml 4096 Apr  9 22:30 dir2
drwxrwxr-x. 2 saml saml 4096 Apr  9 22:30 dir3
drwxrwxr-x. 2 saml saml 4096 Apr  9 22:30 dir4
drwxrwxr-x. 2 saml saml 4096 Apr  9 22:30 dir5

仅更改 dir 的内容。

$ chown -R saml.wheel *

之后的内容。

$ ll
total 20
drwxrwxr-x. 2 saml wheel 4096 Apr  9 22:30 dir1
drwxrwxr-x. 2 saml wheel 4096 Apr  9 22:30 dir2
drwxrwxr-x. 2 saml wheel 4096 Apr  9 22:30 dir3
drwxrwxr-x. 2 saml wheel 4096 Apr  9 22:30 dir4
drwxrwxr-x. 2 saml wheel 4096 Apr  9 22:30 dir5

同时,目录.完好无损。

$ ls -ld .
drwxrwxr-x. 7 saml saml 4096 Apr  9 22:29 .

如果存在隐藏文件,请确保将您的 shell 设置为将它们包含在 glob 中:shopt -s dotglob在 bash、FIGNORE='@(.|..)'ksh93 和setopt dot_globzsh 中。

或者,添加与它们匹配的模式(请注意,在 zsh 以外的 shell 中,.*将匹配...):

chown -R saml.wheel * .[!.]* ..?*

或者在 zsh 中,简单地

chown -R saml.wheel *(D)

答案3

在 zsh 中:

chown user:group **/*(D)

全局限定符 D意味着将匹配点文件。

您可以使用chown递归遍历来代替 shell:

chown -R user:group *(D)

如果您担心文件太多导致命令行太长,请加载chown内置来自zsh/文件模块

zmodload zsh/files
chown user:group **/*(D)

如果您不想引用chown内置函数,则可以仅加载名称zf_*

zmodload -Fm zsh/files b:zf_\*
zf_chown user:group **/*(D)

当您需要对一长串可能不适合命令行限制的文件调用外部命令(此处不是这种情况)时,您可以使用zargs功能:

autoload -U zargs
zargs -- **/*(D) -- chown user:group --

答案4

如果第一个目录中有很多文件,Chris Down 的答案仍然可能会失败。

find . \! -iname . -exec chown user:group {} \;

在大多数情况下,克里斯·唐恩的答案可能不会失败,并且可能比这个答案更快,但我想完全按照您的要求回答您的问题。

另外,这里有一个稍微不同的命令,它更适合我的情况。我不喜欢更改脚本中的目录,因此我编写了如下命令:

find /foo/bar/baz \! -samefile /foo/bar/baz -exec chown user:group {} \;

相关内容