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
#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
如果*产生的参数过多(目录中的文件过多),或者可能不满足您的要求,则这可能不起作用。 />
评论
编辑以反映具有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