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

7
我正在开发一个网站,该网站可以建立其他网站。有些情况下我使用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解决方案? - ajreal
我正在使用cron作业调用PHP文件(作为root用户),如果可能的话,那当然可以。 - Steve Robbins
chown、chmod和chgrp都支持递归操作,也许这甚至不需要PHP,最好使用“find”命令? - ajreal
只有超级用户才能更改文件的所有者。 - Yevgeniy Afanasyev
3个回答

11

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

    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);
    }   

1
所以是 fsmodifyr('/path/to/dir/'); 吗? - Steve Robbins
它能工作吗?我使用那个实现来进行递归删除,我确信它能工作。 - Felipe Buccioni
这真是让人垂涎三尺啊...谢谢。 - Steve Robbins

10
您可以执行一个system调用。
system("/bin/chmod -R $mod $root");
system("/bin/chown -R $user $root");
system("/bin/chgrp -R $user $root");

当然,你可以使用escapeshellarg()或escapeshellcmd()来避免执行任意命令。

1
  1. 我怎样可以为文件和文件夹分别指定不同的权限?
  2. /bin/chmod: invalid mode: 493'。请尝试 /bin/chmod --help' 以获取更多信息。
- Steve Robbins
你不能再回到起点重新开始。 - rouzier

0
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表示您将模式传递为十进制。请先转换为八进制字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接