【问题标题】:changing chmod for files but not directories更改文件而不是目录的 chmod
【发布时间】:2010-11-12 21:26:47
【问题描述】:

我需要使用 chmod 将所有文件递归更改为 664。我想跳过文件夹。 我正在考虑做这样的事情

ls -lR | grep ^-r | chmod 664

这不起作用,我假设是因为我无法通过管道进入 chmod 任何人都知道一个简单的方法来做到这一点?

谢谢

【问题讨论】:

  • 这应该在ServerFault中询问
  • chmod 确实应该能够单独区分文件、链接和文件夹。

标签: unix grep chmod


【解决方案1】:

另一种方法是使用find ... -exec ...,如下所示:

find . -type f -exec chmod 644 {} \;

问题是-exec 为每个效率低下的文件启动chmod 进程。避免这种情况的解决方案是:

find . -type f -exec chmod 644 {} +

这会在chmod 进程命令行上组合尽可能多的文件名参数。 find ... | xargs ... 方法类似;查看接受的答案。

为了记录,如果要 chmoded 的文件太多,或者路径名的聚合长度太大,使用反引号就会中断。

【讨论】:

    【解决方案2】:

    我简洁的两分钱......

    Linux:

    $ chmod 644 `find -type f`
    

    OSX:

    $ chmod 644 `find . -type f`
    

    这可以递归地更改当前目录及其所有子目录中包含的所有文件。如果您想定位不同的目录,请将. 替换为正确的路径:

    $ chmod 644 `find /home/my/special/folder -type f`
    

    【讨论】:

    • 如何指定哪个目录?
    • 我的原始答案涵盖了 OP 所询问的内容:递归更改当前目录中的所有文件。请参阅我的编辑,了解如何将其应用于任何目录,而不仅仅是当前目录。
    • 感谢您提供最简单最短的解决方案
    • 对于带有空格的名称(Mac OS+Bash)对我来说失败了。
    【解决方案3】:

    使用 GNU 查找

    find /path -type f -exec chmod 644 {} +;

    【讨论】:

      【解决方案4】:

      find -exec 的答案是一个很好的答案,但它有一个通常不相关的缺点,即它为每个文件创建了一个单独的子进程。然而,它的功能非常完美,只有在文件数量变得真正很大时才会表现不佳。使用xargs 会将文件名分批成大组,然后再为该 文件运行子进程。

      您只需要注意,在使用 xargs 时,您可以正确处理包含嵌入空格、换行符或其他特殊字符的文件名。

      解决这两个问题的解决方案是(假设您有足够好的findxargs 实现):

      find . -type f -print0 | xargs -0 chmod 644
      

      -print0 导致 find 以 NUL 字符(而不是空格)终止其输出流上的文件名,-0xargs 让它知道它应该期望将其作为输入格式。

      【讨论】:

      • 这对 GNU 查找非常有用,但不幸的是 -print0 和 xargs -0 不是标准的,并且不起作用,例如在 Solaris 上。因此,在这种情况下,请使用其他解决方案之一。
      • 我可以确认此方法适用于 Mac OSX(至少 10.9)。
      • @mark4o,您不仅限于使用 Solaris 附带的 Braindead 版本。 FOSS 的一大优势是您可以将其移植到任何足够接近 (UNIXy) 的操作系统。我经常为 AIX per-version-5L 这样做。
      • 如果您的意思是chmod 的参数太多很多,那不是问题。 xargs 智能地进行批处理。
      • @codeforester, xargs 已经 对文件进行批处理,使它们不超过参数长度限制。 -n/-L 选项只是允许对批量大小进行进一步的任意限制。
      【解决方案5】:

      通过http://www.linuxquestions.org/questions/aix-43/chmod-recursion-files-only-208798/?s=a70210fb5e5d0aa7d3c69d8e8e64e3ed

      "find . -type f -print | xargs chmod 444" 应该工作,不是吗? 如果没有,请查找 . -打印 >myfile.sh 和 vi myfile.sh 删除目录(它们不应该太多),然后 1,$s/^/chmod 444/ 和 sh myfile.sh。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        • 2022-08-02
        • 1970-01-01
        • 2016-01-20
        • 2014-06-21
        • 1970-01-01
        • 2022-01-22
        相关资源
        最近更新 更多