set permissions for all files and folders recursively

前端 未结 5 1190
执笔经年
执笔经年 2021-01-31 04:59

I want to recursively set the folder and file permissions. Folders should get 750 and files 644. I found this and made some adaptions. Would this one work?



        
相关标签:
5条回答
  • 2021-01-31 05:10

    Here improved version of the recursive chmod that skips files with the same permissions.

    <?
    
    header('Content-Type: text/plain');
    
    /**
    * Changes permissions on files and directories within $dir and dives recursively
    * into found subdirectories.
    */
    function chmod_r($dir)
    {
        $dp = opendir($dir);
        while($file = readdir($dp))
        {
            if (($file == ".") || ($file == "..")) continue;
    
            $path = $dir . "/" . $file;
            $is_dir = is_dir($path);
    
            set_perms($path, $is_dir);
            if($is_dir) chmod_r($path);
        }
        closedir($dp);
    }
    
    function set_perms($file, $is_dir)
    {
        $perm = substr(sprintf("%o", fileperms($file)), -4);
        $dirPermissions = "0750";
        $filePermissions = "0644";
    
        if($is_dir && $perm != $dirPermissions)
        {
            echo("Dir: " . $file . "\n");
            chmod($file, octdec($dirPermissions));
        }
        else if(!$is_dir && $perm != $filePermissions)
        {
            echo("File: " . $file . "\n");
            chmod($file, octdec($filePermissions));
        }
    
        flush();
    }
    
    chmod_r(dirname(__FILE__));
    
    0 讨论(0)
  • 2021-01-31 05:12

    This is tested and works like a charm:

    <?
    
      header('Content-Type: text/plain');
    
      /**
      * Changes permissions on files and directories within $dir and dives recursively
      * into found subdirectories.
      */
      function chmod_r($dir, $dirPermissions, $filePermissions) {
          $dp = opendir($dir);
           while($file = readdir($dp)) {
             if (($file == ".") || ($file == ".."))
                continue;
    
            $fullPath = $dir."/".$file;
    
             if(is_dir($fullPath)) {
                echo('DIR:' . $fullPath . "\n");
                chmod($fullPath, $dirPermissions);
                chmod_r($fullPath, $dirPermissions, $filePermissions);
             } else {
                echo('FILE:' . $fullPath . "\n");
                chmod($fullPath, $filePermissions);
             }
    
           }
         closedir($dp);
      }
    
      chmod_r(dirname(__FILE__), 0755, 0755);
    ?>
    
    0 讨论(0)
  • 2021-01-31 05:23

    Why don't use find tool for this?

    exec ("find /path/to/folder -type d -exec chmod 0750 {} +");
    exec ("find /path/to/folder -type f -exec chmod 0644 {} +");
    
    0 讨论(0)
  • 2021-01-31 05:23

    I think yours won't go recursive in case of folders, I fixed this case.

    function chmod_r($Path) {
        $dp = opendir($Path);
         while($File = readdir($dp)) {
           if($File != "." AND $File != "..") {
             if(is_dir($File)){
                chmod($File, 0750);
                chmod_r($Path."/".$File);
             }else{
                 chmod($Path."/".$File, 0644);
             }
           }
         }
       closedir($dp);
    }
    
    0 讨论(0)
  • 2021-01-31 05:32

    My solution will change all files and folder recursively to 0777. I use DirecotryIterator, it's much cleaner instead of opendir and while loop.

    function chmod_r($path) {
        $dir = new DirectoryIterator($path);
        foreach ($dir as $item) {
            chmod($item->getPathname(), 0777);
            if ($item->isDir() && !$item->isDot()) {
                chmod_r($item->getPathname());
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题