Рекурсивно chmod / chown / chgrp все файлы и папки в каталоге - PullRequest
7 голосов
/ 31 августа 2011

Я работаю над сайтом, который строит другие сайты.В некоторых случаях я использую copy () для создания файлов и каталогов, в других случаях я создаю XML-файлы в php и использую DOMDocument :: save для их сохранения.Конечным результатом является корневая папка со всевозможными испорченными разрешениями.По ходу дела я занимаюсь моддингом файлов и папок, в какой-то степени это слова, но у меня возникают особые проблемы, когда дело доходит до использования copy().

(это то, где я до сих пор находилсяhttp://pastebin.com/SBE8vtFX, attn: 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

Myвопрос:

Как изменить одновременно все файлы в указанном каталоге?Я хочу также различать различные настройки 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);
        }
    }

?>

Ответы [ 3 ]

11 голосов
/ 31 августа 2011

Это должно быть полезно.ИЗМЕНЕНО: исправлены некоторые синтаксические ошибки

    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);
    }   
9 голосов
/ 31 августа 2011

Вы можете выполнить системный вызов

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

конечно, вы используете escapeshellarg () или escapeshellcmd () во избежание выполнения произвольных команд

0 голосов
/ 31 августа 2011
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 означает, что вы передали свой режим как десятичный. Сначала преобразуйте в восьмеричную строку.

...