递归 chmod/chown/chgrp 目录中的所有文件和文件夹

Posted

技术标签:

【中文标题】递归 chmod/chown/chgrp 目录中的所有文件和文件夹【英文标题】:Recursively chmod/chown/chgrp all files and folder within a directory 【发布时间】:2011-11-07 20:39:54 【问题描述】:

我正在开发一个构建其他站点的站点。有些时候我使用copy() 创建文件和目录,其他时候我在php 中构建XML 文件并使用DOMDocument::save 来保存它们。最终结果是一个具有各种混乱权限的根文件夹。我一直在修改文件和文件夹,这在某种程度上是什么意思,但在使用copy() 时我特别有麻烦。

(这是我目前所在的位置http://pastebin.com/SBE8vtFX,联系人:function modPath($path)

我想采用不同的方法并递归chmod/chown/chgrp文档根目录中的所有文件和文件夹一次

以文档根目录为例

/home/mysite/public_html

public_html我有

-rwxrwxrwx  1 mysite mysite  348 Aug 31 10:49 index.php
d--------x  5 root   root   4096 Aug 30 10:21 folder1
drwxrwxrwx  2 mysite mysite 4096 Aug 30 09:41 folder2

我的问题:

如何一次修改指定目录中的所有文件?我也想区分目录和文件夹之间的不同 chmod 设置。这需要一个 PHP 解决方案。

这是我能做到的

<?php

    function modAll($root) 
        
        $aPath = explode("/", $root);
        
        $user = $aPath[2];
        
        /* Some sort of looping through $root */ 
            
            $mod = (is_dir($thisfileorfolder) ? 0755 : 0644);
                    
            chmod($thisfileorfolder, $mod);
            chown($thisfileorfolder, $user);
            chgrp($thisfileorfolder, $user);
        
    
    
?>

【问题讨论】:

如果 PHP 调用了 bash 命令(execsystem),是否认为是 PHP 解决方案? 我正在使用 cron 作业来调用 PHP 文件(以 root 用户身份),所以如果可以的话,那就确定。 chown、chmod 和 chgrp 都支持递归,也许这甚至不需要 PHP,使用find 更好? 只有超级用户可以更改文件的所有者。 【参考方案1】:

您可以拨打system 电话

system("/bin/chmod -R $mod $root");
system("/bin/chown -R $user $root");
system("/bin/chgrp -R $user $root");

当然你使用 escapeshellarg() 或 escapeshellcmd() 为了避免执行任意命令

【讨论】:

1) 如何为文件和文件夹指定不同的权限,2) /bin/chmod: invalid mode: 493' 试试/bin/chmod --help' for more information. 我猜你不能回到绘图板【参考方案2】:

这应该会有所帮助。 已编辑:纠正了一些语法错误

    function fsmodify($obj) 
       $chunks = explode('/', $obj);
       chmod($obj, is_dir($obj) ? 0755 : 0644);
       chown($obj, $chunks[2]);
       chgrp($obj, $chunks[2]);
    


    function fsmodifyr($dir) 
    
       if($objs = glob($dir."/*"))         
           foreach($objs as $obj) 
               fsmodify($obj);
               if(is_dir($obj)) fsmodifyr($obj);
           
       

       return fsmodify($dir);
       

【讨论】:

所以fsmodifyr('/path/to/dir/'); ? 它有效吗?我使用该实现进行递归删除,我确信它有效 这值得流口水......谢谢【参考方案3】:
system("/bin/chmod -R $mod $root");
system("/usr/bin/find -type d $root -print0 | xargs -0 | /bin/chmod $moddir");
system("/bin/chown -R $user $root");
system("/bin/chgrp -R $user $root");

无效模式 493 表示您将模式作为十进制传递。先转换成八进制字符串。

【讨论】:

以上是关于递归 chmod/chown/chgrp 目录中的所有文件和文件夹的主要内容,如果未能解决你的问题,请参考以下文章

Linux中文件的可读,可写,可执行权限的解读以及chmod,chown,chgrp命令的用法

Linux中文件的可读,可写,可执行权限的解读以及chmod,chown,chgrp命令的用法

Linux常用指令

Centos系统文件与用户权限分配详解ftp,nginx,php

linux命令

权限管理