繁体   English   中英

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

[英]Recursively chmod/chown/chgrp all files and folder within a directory

我正在一个构建其他站点的站点上工作。 有些时候我使用copy()创建文件和目录,其他时候我在 php 中构建 XML 文件并使用DOMDocument::save保存它们。 最终结果是一个具有各种混乱权限的根文件夹。 我一直在修改文件和文件夹,因为我是 go,这在某种程度上是这样的,但是在使用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);
        }
    }
    
?>

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

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

您可以执行系统调用

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

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

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 表示您以十进制形式传递了您的模式。 首先转换为八进制字符串。

我为此编写了一个库。

使用示例:

<?php

use MathiasReker\FilePerm;

require __DIR__ . '/vendor/autoload.php';

(new FilePerm([__DIR__])) // <-- root directory
    ->setDefaultModeFile(0644) // <-- file permission
    ->setDefaultModeFolder(0755) // <-- folder permission
    ->scan()
    ->fix();

完整文档: https://github.com/MathiasReker/php-file-permissions

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM