我想排除一些大型内容目录
我用它来 chown 目录
chown -R admin /home/admin/web/public_html
有没有办法排除 html 下的子目录
喜欢:
chown -R admin exclude=/home/admin/web/public_html/content /home/admin/web/public_html
类似的东西
谢谢
答案1
chown -R admin $(ls -I content)
ls -I
将列出除指定模式之外的所有内容。
答案2
在 Linux 中,对满足某些条件的文件执行某些操作的最常用工具是find
。很少有其他答案基于这个find … | xargs …
想法,它只有在使用以空字符结尾的字符串时才是健壮的。这意味着find … -print0 | xargs -0 …
,但 POSIX 并不要求这些选项。
和POSIXfind
通常使用-exec
比通过管道传输更好xargs
。我个人更喜欢-exec
即使我可以安全地使用xargs
。知道-exec
也是一个测试,因此可以使用它来构建自定义测试(例子),无论如何,熟悉它是件好事;那么就没有理由不使用它来代替xargs
。 的真正强大之xargs
处在于它能够解析带有引号和转义字符的字符串;但这在从 读取时几乎毫无用处find
,几乎总是有害的。非 POSIX 选项(如-0
和 )--no-run-if-empty
可以成为xargs
的好伴侣find … -print0
,但好的 POSIX 仍然-exec
(几乎?)总是至少一样好。
您的问题可以通过以下方式解决
find /home/admin/web/public_html \
-path /home/admin/web/public_html/content -prune \
-o -exec chown admin {} +
它的工作原理如下:如果路径是,…/content
则不要进入该路径(-prune
);否则( )在文件上-o
执行(注意:chown admin
目录也是一个文件)。
笔记:
请勿
chown -R
在此处使用。测试的第一个文件是/home/admin/web/public_html
,如果您使用chown -R
它,则不会排除任何内容。-exec chown … {} +
可以并将多个路径传递给chown
,而-exec chown … {} \;
只会传递一个路径(因此每个文件都会生成一个chown
路径)。 语法 with+
减少了生成的进程数chown
,从而加快了速度。 即使如此,如果文件数对于单个命令行来说太大,find
也会生成多个进程(比较“chown
参数列表太长“)。请注意,它之所以有效是因为chown
可以采用多条路径;而有些工具则不能,而且对于它们来说,语法+
是不可能的。-path
与整个路径匹配。路径是find
路径所认为的路径,不一定是规范路径。如果起始路径是,/home/admin/web/public_html
则测试的每个路径都将以此字符串开头;但如果起始路径是./
,则测试的每个路径都将以这字符串。在前一种情况下,-path /home/admin/web/public_html/content
即使realpath ./
打印/home/admin/web/public_html
,也永远不会为真,因为相关目录将由字符串标识./content
,而这是您想要匹配的字符串-path
。通常,您需要将参数调整-path
为起始位置(或使用通配符或许)。如果您需要排除多个模式,请按照以下示例操作:
find . \ -path ./content -prune \ -o -path ./foo/bar -prune \ -o -path '*/baz' -prune \ -o -exec chown admin {} +
可以压缩为
find . \ \( -path ./content \ -o -path ./foo/bar \ -o -path '*/baz' \ \) -prune \ -o -exec chown admin {} +
在哪里括号很重要。
您
-regex
可以将多个图案组合成一个(例子)。虽然 POSIX 没有指定此测试,但 的实现find
可能支持也可能不支持它。您标记了德比安;由于 Debianfind
是 GNUfind
,因此它支持-regex
。可以使用其他测试(例如
-name
或甚至)来排除文件。-exec
答案3
您可以使用!(enumeration_of_directories)
符号排除目录。示例从中删除媒体和日志chown
chown -R myuser:mygroup /www/myapp/!(media|logs)
答案4
find . -type d -not -path /home/admin/web/public_html -prune -o -print0 | xargs -0 chown admin
其中-type d
按目录过滤并-not -path /home/admin/web/public_html
排除目录。