我经常使用
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_glob
zsh 中。
或者,添加与它们匹配的模式(请注意,在 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 {} \;