chown -R 排除一些目录

chown -R 排除一些目录

我想排除一些大型内容目录

我用它来 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是 GNU find,因此它支持-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排除目录。

相关内容