简体   繁体   中英

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

I am working on a site which builds other sites. Some if it I use copy() to create the files and directories, other times I'm building XML files in php and using DOMDocument::save to save them. The end result is a root folder with all sorts of messed up permissions. I've beening modding files and folders as I go, which words to some extent, but I'm particularly having trouble when it comes to using copy() .

(This is where I'm at so far http://pastebin.com/SBE8vtFX , attn: function modPath($path) )

I want to take a different approach and recursively chmod/chown/chgrp all the files and folders within my document root to my specifications at once .

Take for example the document root

/home/mysite/public_html

and within public_html I have

-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

My question:

How can I mod all files within a specified directory at once? I want to differentiate different chmod settings between directories and folders as well. This needs to be a PHP solution.

This is as far as I can get

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

This should be helpful. EDITED: some syntax errors corrected

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

You can perform a system call

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

of course you use escapeshellarg() or escapeshellcmd() in order to avoid executing arbitrary commands

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

Invalid mode 493 means you passed your mode as decimal. Convert to octal string first.

I have coded a library for that.

Example of usage:

<?php

use MathiasReker\FilePerm;

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

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

Full documentation: https://github.com/MathiasReker/php-file-permissions

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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