Answers:
递归模式仅适用于目录,不适用于文件。通过使用glob'* .pdf',外壳程序将文件列表传递给chown,后者将看到这些文件,并更改对其看到的文件的权限,仅此而已。
请记住,在shell中,glob是由shell而不是命令求值的。如果glob与文件匹配,则将它们传递给命令,并且该命令永远不会知道glob存在。(这与Windows Command提示符用于执行操作的方式不同)。如果您有目录,其内容类似于:
machine:$ ls -F
file1.pdf file2.pdf other.txt subdir/
然后您输入:
chown -R someuser:somegroup *.pdf
外壳程序将首先列出该列表:file1.pdf file2.pdf
然后运行命令:
chown -R someuser:somegroup file1.pdf file2.pdf
看到,没有目录可用于-R。它按照您的要求进行操作-在命令行上更改两个文件的所有权,而忽略该古怪的-R标志。
要执行所需的操作,可以将'* .pdf'用作该目录和子目录的模式,可以使用find
,它可以找到与文件名模式(或许多其他criterea)匹配的文件并传递给子命令
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 提供了更强大的glob 。在zsh中,使用递归glob相同**
:
chown -R someuser:somegroup ./**/*.pdf
chown -R someuser:somegroup /your/folder/here/*
这将chown应用于指定文件夹的所有文件以及所有子目录和子目录。小心使用。
sudo chown -R user ./
为我工作,但sudo chown -R user ./*
没有
.env
。
您可以使用该find
实用程序:
find . -name '*.pdf' -exec chown someuser:somegroup {} +
请不要忘记周围的引号*.pdf
。否则外壳将尝试扩展它。这意味着外壳程序将用*.pdf
当前目录中找到的所有PDF文件的名称替换。但这不是您想要的。您要查找位于子目录中的PDF文件。顺便说一句:这也是您的chown
命令的问题。
+
整洁的性能技巧。-exec command {} +
-exec操作的此变体在选定的文件上运行指定的命令,但是通过在末尾附加每个选定的文件名来构建命令行。该命令的调用总数将大大少于匹配文件的数目。命令行的构建与xargs
构建命令行的方式几乎相同。命令中仅{}
允许的一个实例。该命令在起始目录中执行。
命令
chown -R someuser:somegroup *.pdf
如果目录名称以.pdf结尾,则仅递归目录。您需要类似:
find . -name "*.pdf" -exec chown someuser:somegroup {} \;
要递归更改目录的所有权,只需使用:
sudo chown -R <username>:<groupname> <dir name>
这里username =应该是目录所有者的新用户
groupname =应该是目录所有者的新组
每个文件/目录都有一个用户所有者和一个组所有者
我tree
改用:
sudo tree -fai ~/.blabla | xargs -L1 -I{} sudo chown youruser:youruser {}
还请注意不要在“ /”目录或其他系统目录上运行递归chown或chmod。
shopt -s globstar
递归遍历的bash 4 。