我有一个名为的目录 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 = 应为目录所有者的新组
每个文件/目录都有一个用户所有者和一个组所有者