我怎样才能使 chown 递归工作?

我怎样才能使 chown 递归工作?

我有一个名为的目录 pdfs,其中包含一堆子目录和子子目录。我想更改所有子文件夹中所有 PDF 文件的所有权。我刚刚尝试过这个:

chown -R someuser:somegroup *.pdf

...但它没有改变子目录中 PDF 的所有权。用户和组确实存在。

根据的手册页chown-R应该意味着递归:

-R, --recursive
          operate on files and directories recursively

我错过了什么?

答案1

递归模式仅适用于目录,不适用于文件。通过使用 glob '*.pdf',shell 将文件列表传递给 chown,chown 会认为这些是文件,并更改它所看到的文件的权限,仅此而已。

请记住,在 shell 中,glob 由 shell 而不是命令进行评估。如果 glob 与文件匹配,则将其传递给命令,而命令永远不会知道 glob 的存在。(这与 Windows 命令提示符以前的操作方式不同)。如果您有一个目录,其内容如下:

machine:$ ls -F
file1.pdf  file2.pdf  other.txt  subdir/

然后你输入:

chown -R someuser:somegroup *.pdf

shell 首先会列出以下列表:file1.pdf file2.pdf

然后运行命令:

chown -R someuser:somegroup file1.pdf file2.pdf

瞧,没有目录可供 -R 操作。它会执行您要求的操作 - 在命令行上更改两个文件的所有权,忽略那个古怪的 -R 标志。

要执行您想要的操作,使用“*.pdf”作为此目录和子目录的模式,您可以使用find,它可以找到与文件名模式(或许多其他标准)匹配的文件并传递给子命令

find . -type f -name '*.pdf' | xargs chown someuser:somegroup

它从当前目录“.”开始查找名称为模式的文件(文件类型 f),'*.pdf'然后传递给 xargs,后者构造一个用于 chmod 的命令行。请注意模式 周围的引号'*.pdf',请记住,如果可以,shell 将创建一个 glob,但您希望将模式传递给find,因此您需要将其括起来。

因为文件名中可能有空格,所以您需要使用一个技巧来使带空格的文件名安全:

find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup

在 bash 3 及更低版本中,您需要这样做。bash 4(带有shopt -s globstar)和其他 shell 中提供了更强大的通配符。zsh 中也是一样,使用递归通配符**

chown -R someuser:somegroup ./**/*.pdf

答案2

chown -R someuser:somegroup /your/folder/here/*

这会将 chown 应用于指定文件夹的所有文件以及所有子目录和子子目录。请谨慎使用。

答案3

您可以使用该find实用程序:

find . -name '*.pdf' -exec chown someuser:somegroup {} +

请不要忘记 周围的引号*.pdf。否则 shell 将尝试扩展它。这意味着 shell 将用当前目录中找到的所有 PDF 文件的名称替换。但这不是您想要的。您想查找位于子目录中的 PDF 文件。顺便说一句:这也是您的命令*.pdf的问题。chown

答案4

要以递归方式更改目录的所有权,只需使用:

sudo chown -R <username>:<groupname> <dir name>

此处用户名 = 应为目录所有者的新用户

groupname = 应为目录所有者的新组

每个文件/目录都有一个用户所有者和一个组所有者

相关内容