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

chown -R someuser:somegroup *.pdf


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

根据chown的手册页,-R应该表示递归:

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


我缺少什么?

#1 楼

递归模式仅适用于目录,不适用于文件。通过使用glob'* .pdf',外壳程序将文件列表传递给chown,后者将看到这些文件,并更改其所看到的文件的权限。就是这样。

记住,在外壳程序,则由外壳程序而不是命令来评估glob。如果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


在当前目录“。”中查找名称模式为'*.pdf'的文件(文件类型f),然后传递给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提供了更强大的globing。使用递归Glob在zsh中也是如此**

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


评论


编辑以反映具有shopt -s globstar的bash 4确实递归glob。

– kojiro
2011-3-22在22:54

@kojiro谢谢!如您所知,我仍然使用bash3

– Rich Homolka
2011年3月22日在22:58

根据原始海报显示的手册页,我发现chown -R确实改变了文件夹和文件的所有者。无需查找。使用薄荷15。

– gwideman
2013年9月28日在12:23

@gwideman我知道这很旧了...但是,是的,-R当然是递归的。 OP只是遇到了一种非常具体的递归类型问题,即扩展名和“文件类型为文件”过滤掉的一个

– Rich Homolka
2015年3月7日23:40在

@RichHomolka啊。 OP表示这些文件位于名为“ pdfs”的目录中,因此我认为问题在于如何将pdfs指定为要递归的目录,并且其中包含的所有文件均为pdfs,因此无需专门选择它们。但是,如果您的工作是仅选择pdf文件,而其他文件保持不变,则您可能是对的。

– gwideman
15年3月8日在23:51

#2 楼

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


这将chown应用于指定文件夹的所有文件以及所有子目录和子目录。小心使用。

评论


sudo chown -R用户./以某种方式为我工作,但sudo chown -R用户./*却没有

–劳斯
18年6月4日在8:14



我知道这很老了,但是尽管这回答了标题,却没有回答问题。这实际上比OP已经尝试的要差一些。

– Rich Homolka
18年7月20日在15:29

@RichHomolka仅仅因为问题标题而来到这里,我很高兴找到这个答案。

–FélixGagnon-Grenier
19年3月12日在20:49

@FélixGagnon-Grenier足够公平。如果这个答案对您有用,我会很高兴。但这不适用于原始问题。

– Rich Homolka
19年3月15日在17:22

这适用于我的隐藏文件(“点文件”)

–lobi
2月21日20:46

#3 楼

您可以使用find实用程序:

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


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

评论


我必须查找+整洁的性能技巧。 -exec命令{} + -exec操作的此变体在选定的文件上运行指定的命令,但是通过在末尾附加每个选定的文件名来构建命令行。该命令的调用总数将远小于匹配文件的数目。命令行的构建与xargs构建命令行的方式几乎相同。命令中仅允许{}的一个实例。该命令在起始目录中执行。

–帕特里克M
14年1月13日在18:28

@PatrickM + vs的另一个(次要)优势; ....再加上不是shell元字符,也不必转义

– Rich Homolka
18年7月20日在14:36

#4 楼

如果目录名称以.pdf结尾,则命令

chown -R someuser:somegroup *.pdf


仅递归目录。您需要以下内容:

find . -name "*.pdf" -exec chown someuser:somegroup {} \;


评论


从技术上讲,它只会下降一级。无论您是否调用真正的递归都是用户的练习:)

– Rich Homolka
15年4月6日在21:28

#5 楼

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

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


这里username =应该是目录所有者的新用户

groupname =应该是目录所有者的新组

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

评论


这不符合OP的要求。 OP要求一组特定的文件,这将更改所有内容的所有权。

– Rich Homolka
17年1月15日在18:50

#6 楼

我改用tree

 sudo tree -fai ~/.blabla  | xargs -L1 -I{} sudo chown youruser:youruser {}


也要注意不要在'/'目录或其他系统目录上运行递归chown或chmod。

#7 楼

要成为目录中所有文件的所有者,请使用

find directory -type f -name '*' | sudo xargs -d '\n' chown $USER


而不是

sudo chown $USER directory\*




sudo chown --recursive $USER directory


如果*产生的参数过多(目录中的文件过多),或者可能不满足您的要求,则这可能不起作用。 />