chown -R 排除某个目录

Mit*_*tra 5 linux debian chmod chown file-permissions

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

我用它来 chown 目录

chown -R admin /home/admin/web/public_html
Run Code Online (Sandbox Code Playgroud)

无论如何要排除html下的子目录

喜欢:

chown -R admin exclude=/home/admin/web/public_html/content /home/admin/web/public_html
Run Code Online (Sandbox Code Playgroud)

类似的东西

谢谢

Ash*_*ark 5

chown -R admin $(ls -I content)
Run Code Online (Sandbox Code Playgroud)

ls -I 将列出除指定模式之外的所有内容。

  • **警告:这个答案存在严重缺陷。** 不要使用它。也许除非您了解它的缺陷并且可以告诉它们在您的特定情况下不会造成任何伤害。但这仍然就像用枪当锤子:即使没有子弹,这也不是一个明智的主意。缺陷:(1)[解析`ls`是错误的](https://mywiki.wooledge.org/ParsingLs)。(2) [Bash pitfall number 1](https://mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29)(你有`chmod`而不是`for`,但问题是一样的)。(3) 可能是“[参数列表太长](https://unix.stackexchange.com/q/128559/108618)”。 (4认同)

Kam*_*ski 5

在 Linux 中,对满足某些条件的文件执行某些操作的最通用工具是find. 很少有其他答案基于这个find \xe2\x80\xa6 | xargs \xe2\x80\xa6想法,只有当它使用空终止字符串时,它才是稳健的。这意味着find \xe2\x80\xa6 -print0 | xargs -0 \xe2\x80\xa6,但 POSIX 不需要这些选项。

\n

对于POSIX,find通常使用它-exec比通过管道传输到xargs. -exec就我个人而言,即使我可以安全地使用,我也更喜欢xargs。知道这-exec也是一个测试,因此它可以用于构建自定义测试(示例),无论如何熟悉它都是很好的;然后就没有理由不使用它来代替xargs. 真正的强大之处xargs在于它能够解析带有引号和转义字符的字符串;但这在读取时几乎没有用find,几乎总是有害的。非 POSIX 选项如-0--no-run-if-empty可以成为xargs的良好伴侣find \xe2\x80\xa6 -print0,但好的 POSIX 仍然-exec(几乎?)总是至少一样好。

\n

您的问题可以通过以下方式解决

\n
find /home/admin/web/public_html \\\n   -path /home/admin/web/public_html/content -prune \\\n   -o -exec chown admin {} +\n
Run Code Online (Sandbox Code Playgroud)\n

它的工作原理如下:如果路径是,\xe2\x80\xa6/content则不要下降到它(-prune);否则 ( -o)chown admin对文件执行(注意:目录也是文件)。

\n

笔记:

\n
    \n
  • 不要chown -R在这里使用。测试的第一个文件是/home/admin/web/public_html,如果您使用chown -R它,则不会排除任何内容。

    \n
  • \n
  • -exec chown \xe2\x80\xa6 {} +可以并且将会向 传递多个路径chown,而-exec chown \xe2\x80\xa6 {} \\;只会传递一个路径(因此每个文件都会生成一个路径chown)。该语法+减少了生成进程的数量chown,从而加快了速度。即使这样,如果文件数量对于单个命令行来说太大(比较“参数列表太长”),find也会产生多个进程。请注意,它之所以有效,是因为可以采用多个路径;有些工具不能,对它们来说,语法是不可能的。chownchown+

    \n
  • \n
  • -path与整个路径匹配。路径就是find我们认为的路径,不一定是规范路径。如果起始路径是/home/admin/web/public_html,则每个测试的路径都将以该字符串开头;但如果起始路径是,则每个测试的路径都将以./字符串开头。在前一种情况下,即使prints也永远不会成立,因为相关目录将由字符串标识,而这是您想要与之匹配的字符串。一般来说,您需要将 的参数调整为起始位置(或者可能使用通配符)。-path /home/admin/web/public_html/contentrealpath .//home/admin/web/public_html./content-path-path

    \n
  • \n
  • 如果您需要排除多种模式,请按照以下示例操作:

    \n
    find . \\\n   -path ./content -prune \\\n   -o -path ./foo/bar -prune \\\n   -o -path \'*/baz\' -prune \\\n   -o -exec chown admin {} +\n
    Run Code Online (Sandbox Code Playgroud)\n

    可以压缩为

    \n
    find . \\\n   \\( -path ./content \\\n      -o -path ./foo/bar \\\n      -o -path \'*/baz\' \\\n   \\) -prune \\\n   -o -exec chown admin {} +\n
    Run Code Online (Sandbox Code Playgroud)\n

    其中括号很重要

    \n

    有了它,-regex您也许可以将多种模式组合成一种模式(示例)。尽管 POSIX 未指定此测试,但其实现find可能支持也可能不支持。您标记了;Debian 中find是 GNU find,它支持-regex.

    \n
  • \n
  • 其他测试(例如-name或什至-exec)可用于排除文件。

    \n
  • \n
\n


小智 0

find . -type d -not -path /home/admin/web/public_html  -prune -o -print0 | xargs -0 chown admin 
Run Code Online (Sandbox Code Playgroud)

其中-type d按目录过滤并-not -path /home/admin/web/public_html排除目录。