【问题标题】:How to change permissions for a folder and its subfolders/files in one step如何一步更改文件夹及其子文件夹/文件的权限
【发布时间】:2011-04-13 23:59:43
【问题描述】:

我想在 Linux 中通过一个步骤(命令)更改文件夹及其所有子文件夹和文件的权限。

我已经尝试过以下命令,但它仅适用于提到的文件夹:

chmod 775 /opt/lampp/htdocs

有没有办法为/opt/lampp/htdocs 及其所有内容(包括子文件夹和文件)设置chmod 755

另外,以后如果我在htdocs里面新建一个文件夹或者文件,那它的权限怎么自动设置为755呢?

我也看过这个 Stack Overflow 问题:

How can I set a default 'chmod' in a Linux terminal?

【问题讨论】:

  • 你是打算写chmod 75 /opt/lampp/htdocs还是真的应该写chmod 755 /opt/lampp/htdocs
  • @ArthurDent,因为这个问题(虽然完全有效且有帮助)更适合以系统为中心的 SE 站点,例如 SuperUser 或 ServerFault。它与编程没有明确的关系。
  • @timelmer 当然,但我再次问,为什么是“权限”、“文件夹”和“cmod”标签?什么时候可以“明确”使用 cmod 进行编程?
  • @timelmer 这个问题难道不是关于 bash 编程的吗?
  • 如果你想变得非常挑剔,Bash 实际上是一种脚本语言,但 php 也是如此,SO 似乎并不介意。

标签: linux permissions directory chmod


【解决方案1】:

要设置到所有子文件夹(递归)使用 -R

chmod 755 /folder -R

并使用 umask 将默认设置为新文件夹/文件 光盘/文件夹 umask 755

【讨论】:

  • 请勿将umask 设置为 755!您将无法列出、读取或使用您创建的任何文件或目录!
  • 这会将所有设置为 755,包括文件。!
  • @sleepynate 你到底在说什么? 755表示所有者可以读、写和执行,其他所有用户都可以读和执行,但不能写入对象
  • @NicHartley @svin83 umask 是将从权限中屏蔽掉的位,因此它实际上是 chmod 的逆操作。 λ ~ → umask 022 λ ~ → umask -S u=rwx,g=rx,o=rx λ ~ → umask 755 λ ~ → umask -S u=,g=w,o=w
  • 应该不需要删除线(这就是修订历史的用途)。答案应该看起来好像是今天写的。
【解决方案2】:

检查 -R 选项

chmod -R <permissionsettings> <dirname>

以后,你可以先查看手册页来节省大量时间:

man <command name>

所以在这种情况下:

man chmod

【讨论】:

  • 它代表手册页,是一个 linux 命令,显示命令的手册页(大多数 linux 命令都有手册页)。试试 man ls 或 man man。
  • 这在 Mac OS X 的终端中对我不起作用。在那里我做了“chmod -R *”并且它起作用了。
  • 请参阅下面@WombleGoneBad 的回答。您需要为文件和文件夹设置不同的权限。
  • 我认为现在在这里发帖或使用 Google 比使用 man 更快。特别是对于像 grep 这样的东西,如果您是 man 的新手,在文档中查找示例可能非常耗时,但 Google 或 SO 会在几秒钟内提供示例。
  • 郑重声明,不熟悉Linux的可能不熟悉man。我只知道它的存在,但试图弄清楚如何使用它需要谷歌冒险本身。可能是一个值得的冒险,但你应该意识到我通过谷歌找到了这篇非常好的帖子,它回答了我所问的确切问题。资源啊朋友资源是无价的。你可能认为这是没有意义的,他应该检查那个人,但这帮助了我和其他数百人(甚至数千人)。所以请考虑一下。
【解决方案3】:

用途:

sudo chmod 755 -R /whatever/your/directory/is

但是,请注意这一点。如果您更改了错误文件/文件夹的权限,这真的会伤害您。

【讨论】:

    【解决方案4】:

    chmod 755 -R /opt/lampp/htdocs 将递归设置权限。无法仅在设置权限后创建的此目录中自动设置文件的权限,但您可以通过设置 umask 022 来更改系统范围的默认文件权限。

    【讨论】:

    • sleepynate 的答案是唯一正确的答案。发帖人问了两个问题:1)如何修复文件和文件夹的权限,以及 2)如何更改默认值(意思是“未来”文件)。正如 nate 所说,第一个是“chmod”,第二个是“umask”。我还要补充一点,没有办法仅在 1 个目录上更改 umask... umask 是每个用户的“全有或全无”。然而,没有什么能阻止你创建一个与你共享组的新用户,这样你就可以“sudo -u someuser [create file]”。这有点跳出框框思考,但这是一个很好的解决方法。
    • 我认为你是对的,但inherit 不能解决很多情况,还是只能与 NTFS-3G 一起使用?
    • 未来可能会创建未授予文件夹权限的文件夹,可能无法将文件夹从其他地方(如 PC)复制到该目标目录(在服务器上),例如 myforlder ) 因为它会尝试在目标目录中创建一个名为 myfolder 的新文件夹,而您没有这样做的权限。因为我有root,所以我只使用chown -R username:usergroup /directory
    【解决方案5】:

    正确的递归命令是:

    sudo chmod -R 755 /opt/lampp/htdocs
    

    -R:更改每个子文件夹,包括当前文件夹

    【讨论】:

    • 嗨,您确定当前文件夹是其中的一个吗?
    • OSX USING: sudo chmod 777 logs/ -R GETTING: chmod: -R: No such file or directory 应该是: sudo chmod -R 777 logs/
    【解决方案6】:

    对于 Mac OS X 10.7 (Lion),它是:

    chmod -R 755 /directory
    

    是的,正如所有其他人所说,这样做时要小心。

    【讨论】:

      【解决方案7】:

      其他答案是正确的,因为chmod -R 755 会将这些权限设置为树中的所有文件和子文件夹。 但是你到底为什么想要?可能对目录有意义,但为什么要在所有文件上设置执行位?

      我怀疑您真正想要做的是将目录设置为 755,然后不理会文件或将它们设置为 644。为此,您可以使用 find 命令。例如:

      要将所有目录更改为 755 (drwxr-xr-x):

      find /opt/lampp/htdocs -type d -exec chmod 755 {} \;
      

      要将所有文件更改为 644 (-rw-r--r--):

      find /opt/lampp/htdocs -type f -exec chmod 644 {} \;
      

      一些解释:(感谢@tobbez

      • chmod 755 {} 指定find 将为每个目录执行的命令
      • chmod 644 {} 指定find 将为每个文件执行的命令
      • {} 替换为路径
      • ; 分号告诉 find 这是它应该执行的命令的结尾
      • \; 分号是escaped,否则shell 会解释它而不是find

      【讨论】:

      • 有人愿意解释一下这行末尾的{} \; 是什么意思吗?
      • @Nilzor chmod 644 {} \; 指定将由find 为每个文件执行的命令。 {} 替换为文件路径,分号表示命令结束(转义,否则会被 shell 解释,而不是 find)。
      • "但是为什么要在所有文件上设置执行位" 为什么不呢?我是 Ubuntu/Linux 新手...
      • @FlavorScape Womble 在 find 返回的目录上专门设置执行位。目录的执行权限允许用户类列出该目录的内容并 cd 进入该目录。一般而言,您希望目录中的 r 和 x 都可供您访问,即使可能存在仅设置一个或另一个的奇怪边缘情况。有关更多信息,请参阅本指南:nixsrv.com/llthw/ex23
      • 除了 sleepynate 之外,每个回复都忽略了他关于设置未来中创建的文件/文件夹权限的问题。
      【解决方案8】:

      如果要将所有文件的权限设置为a+r,并将所有目录的权限设置为a+x,并通过完整的子目录树递归地执行此操作,请使用:

      chmod -R a+rX *
      

      X(即大写的X,不小x!)对于文件会被忽略(除非它们已经对某人可执行),但用于目录。

      【讨论】:

      • 很好的答案。请注意, * 不会匹配隐藏文件(以点开头的名称)。那么,使用 . (对于当前目录)。
      • 这是正确答案。就我而言,我想将所有目录设置为 775,将所有文件设置为 664。 @Pete 的出色回答让我找到了 chmod 文档,在那里我发现我可以使用 chmod -R g+wX .。太棒了!
      • 这不会删除文件上的x,如果他们已经拥有它。
      • 如果不完全清楚,大写 X 表示“使所有目录可执行”(但不是文件)。
      • @BenoitDuffez 如果您的目标是还从文件中删除可执行位,您可以组合指令,如“a-x+rX”从所有内容中删除“x”,然后将“r”设置为一切和“x”只到目录。
      【解决方案9】:

      您可能需要考虑在Super User 上使用this answer given by nik,并对所有文件/文件夹使用“一个 chmod”,如下所示:

      chmod 755 $(find /path/to/base/dir -type d)
      chmod 644 $(find /path/to/base/dir -type f)
      

      【讨论】:

      • 警告,很容易遇到命令行限制。
      • 我有这个错误:-bash: /bin/chmod: Argument list too long
      • 最好使用find-exec选项来克服Argument list too long错误。
      • 同意@miravalls - find 。 -type d -exec chmod 755 {} \;&& 查找。 -type f -exec chmod 644 {} \;
      【解决方案10】:

      查找文件和应用chmod有两个答案。

      第一个是find 文件并在找到时应用chmod(如@WombleGoneBad 所建议的那样)。

      find /opt/lampp/htdocs -type d -exec chmod 755 {} \;
      

      第二种解决方案是使用find 命令生成所有文件的列表,并将此列表提供给chmod 命令(如@lamgesh 所建议的那样)。

      chmod 755 $(find /path/to/base/dir -type d)
      

      只要find 命令返回的文件数量很少,这两个版本都可以正常工作。第二个解决方案看起来很棒,并且比第一个解决方案更具可读性。如果文件很多,第二种解决方法返回错误:Argument list too long.

      所以我的建议是

      1. 如果您想一次更改所有文件和目录的权限,请使用chmod -R 755 /opt/lampp/htdocs
      2. 如果您使用的文件数量很大,请使用find /opt/lampp/htdocs -type d -exec chmod 755 {} \;-type x 选项仅搜索特定类型的文件,其中 d 用于查找目录,f 用于文件,l 用于链接。
      3. 否则使用chmod 755 $(find /path/to/base/dir -type d)
      4. 最好在任何情况下使用第一个

      【讨论】:

        【解决方案11】:

        这是将目录设置为 775 并将文件设置为 664 的另一种方法。

        find /opt/lampp/htdocs \
        \( -type f -exec chmod ug+rw,o+r {} \; \) , \
        \( -type d -exec chmod ug+rwxs,o+rx {} \; \)
        

        它可能看起来很长,但它非常酷,原因有以下三个:

        1. 只扫描文件系统一次,而不是两次。
        2. 更好地控制文件的处理方式与目录的处理方式。这在使用 special modes(例如 sticky bit)时很有用,您可能希望将其应用于目录而不是文件。
        3. 直接使用man 页面中的技术(见下文)。

        请注意,我尚未确认此解决方案与仅使用两个 find 命令(如 Peter Mortensen 的解决方案)之间的性能差异(如果有的话)。然而,在手册中看到一个类似的例子是令人鼓舞的。

        来自man find 页面的示例:

        find / \
        \( -perm -4000 -fprintf /root/suid.txt %#m %u %p\n \) , \
        \( -size +100M -fprintf /root/big.txt %-10s %p\n \)
        
        Traverse the filesystem just once, listing setuid files and direct‐
        tories into /root/suid.txt and large files into /root/big.txt.
        

        干杯

        【讨论】:

        • 现在,如何将其转换为 shell 脚本以便我们可以运行 openmod $folder ?
        • 各位,请使用 xargs。它节省了数千个进程调用。
        • {} + 可以用 find 做同样的事情 xargs 通常做的事情。
        【解决方案12】:

        我认为 Adam 是在询问如何更改所有尝试在 /opt/lampp/htdocs 目录上操作的进程的 umask 值。

        用户文件创建模式掩码 (umask) 用于确定新创建文件的文件权限。可用于控制新文件的默认文件权限。

        因此,如果您将使用某种 FTP 程序将文件上传到 /opt/lampp/htdocs,您需要配置您的 FTP 服务器以使用您想要的 umask。

        如果需要创建文件/目录,例如PHP,则需要修改PHP代码:

        <?php
            umask(0022);
            // Other code
        ?>
        

        如果您要从 Bash 会话创建新文件/文件夹,您可以在 shell 配置文件 ~/.bashrc 文件中设置 umask 值。

        或者您可以在/etc/bashrc/etc/profile 文件中为所有用户设置一个umask。

        将以下内容添加到文件中:

        umask 022
        
        Sample umask Values and File Creation Permissions
        If umask value set to    User permission     Group permission     Others permission
        000                            all                 all                   all
        007                            all                 all                   none
        027                            all             read / execute               none
        

        要更改已创建文件的权限,您可以使用find

        【讨论】:

          【解决方案13】:

          您要确保适当的文件和目录是 chmod-ed/权限,因为它们是适当的。对于您想要的所有目录

          find /opt/lampp/htdocs -type d -exec chmod 711 {} \;
          

          对于所有的图像,JavaScript、CSS、HTML……好吧,你不应该执行它们。所以使用

          chmod 644 img/* js/* html/*
          

          但是对于所有的逻辑代码(例如 PHP 代码),您应该设置权限,使用户看不到该代码:

          chmod 600 file
          

          【讨论】:

            【解决方案14】:

            您可以使用-Rchmod 递归遍历所有文件和子文件夹。

            您可能需要 sudo,因为它取决于当前用户或其他用户安装的 LAMP

            sudo chmod -R 755 /opt/lampp/htdocs
            

            【讨论】:

            • 不知何故,sudo chmod 755 -R /directory 不起作用,但 sudo chmod -R 755 /directory 起作用了。诡异的。顺便说一句,我正在使用 Mac os x。
            • 根据我的经验这是正确的。该标志必须直接出现在 chmod 之后,而不是字符串中的任何位置。
            • 上面写的命令是错误的。正确的递归命令是:sudo chmod -R 755 /opt/lampp/htdocs 注意:-R 应该在 755 之前
            • 应该被编辑,在没有迂腐语法的 mac osx 上不起作用。
            • OSX USSING: sudo chmod 777 logs/ -R GETTING: chmod: -R: No such file or directory 应该是: sudo chmod -R 777 logs/
            【解决方案15】:

            chmod -R 755 directory_name 有效,但是您如何将新文件也保留到 755?文件的权限成为默认权限。

            【讨论】:

            • 我做到了,但无法从那里打开终端。我无法修复它。
            【解决方案16】:

            这很简单。

            在终端中,转到文件管理器。示例:sudo nemo。转到/opt/,然后单击属性权限。然后其他。最后,更改为创建和删除以及对 readwrite 的文件访问权限,然后单击按钮 Apply... 就可以了。

            【讨论】:

            • 什么是 sudo nemo?
            • nemo 是 Cinnamon 的图形文件管理器。它可能已安装,也可能未安装,并且需要您运行图形环境。
            • 请注明这是桌面操作系统。
            【解决方案17】:

            您可以使用以下命令更改权限:

            sudo chmod go+rwx /opt/lampp/htdocs
            

            【讨论】:

              【解决方案18】:

              对于已经创建的文件:

              find . \( -type f -exec chmod g=r,o=r {} \; \) , \( -type d -exec chmod g=rx,o=rx {} \; \)
              

              对于未来创建的文件:

              sudo nano /etc/profile
              

              并设置:

              umask 022
              

              常见的模式有:

              • 077: u=rw,g=,o=
              • 007: u=rw,g=rw,o=
              • 022: u=rw,g=r,o=r
              • 002: u=rw,g=rw,o=r

              【讨论】:

                【解决方案19】:

                对于仍在为权限问题苦苦挣扎的任何人,请从项目的根目录向上导航一级目录cd ..,将您自己(用户)添加到该目录并授予编辑其中所有内容的权限(在 macOS 上测试)。

                为此,您将运行以下命令(首选):

                sudo chown -R username: foldername .*
                

                注意:对于当前未保存的更改,可能需要先重新启动代码编辑器才能在不要求输入密码的情况下保存。

                另外,请记住,您可以在输入用户名和文件夹的同时按 Tab 键查看选项,以方便您自己操作。


                或者简单地说:

                sudo chmod -R 755 foldername
                

                但是如上所述,你需要小心第二种方法。

                【讨论】:

                • 简单而有效的答案。
                • 非常感谢。这节省了我很多时间
                【解决方案20】:

                用途:

                sudo chmod -R a=-x,u=rwX,g=,o= folder
                

                所有者rw,其他人无权访问,并且目录带有rwx。这将清除文件上现有的“x”。

                Chmod 744 中解释了符号 chmod 计算。

                【讨论】:

                  猜你喜欢
                  • 2014-05-08
                  • 1970-01-01
                  • 2012-02-16
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-04-27
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-07-13
                  相关资源
                  最近更新 更多