2012-02-13 14 views
12

Klasör ve dosya izinlerini yinelemeli olarak ayarlamak istiyorum. Klasörler 750 ve dosya 644'ü almalıdır. this'u buldum ve bazı uyarlamalar yaptım. Bu bir işe yarar mı?Tüm dosyalar ve klasörler için tekrarlı izinler ayarlama

<?php 

function chmod_r($Path) { 
    $dp = opendir($Path); 
    while($File = readdir($dp)) { 
     if($File != "." AND $File != "..") { 
     if(is_dir($File)){ 
      chmod($File, 0750); 
     }else{ 
      chmod($Path."/".$File, 0644); 
      if(is_dir($Path."/".$File)) { 
       chmod_r($Path."/".$File); 
      } 
     } 
     } 
    } 
    closedir($dp); 
} 

?> 

cevap

24

Neden bunun için bulma aracını kullanmayın?

exec ("find /path/to/folder -type d -exec chmod 0750 {} +"); 
exec ("find /path/to/folder -type f -exec chmod 0644 {} +"); 
+2

Bu, kısıtlı PHP'ye sahip bazı barındırma sağlayıcılarında çalışmaz. Bunu yapmak için PHP API kullanmanız gerekecek (aşağıdaki cevaplara bakınız). –

+1

Bu, bazı dizinde yanlışlıkla FTP aracılığıyla çok düşük (ör .644) izinler ayarladığınızda çok kullanışlıdır - bu, onu düzeltmenin bir yoludur. –

+0

Bu çözümü açıklayabilir misiniz? –

2

Sanırım klasörler söz konusu olduğunda özetler değişmeyecek, bu datayı düzelttim.

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

olarak ayarlayın. Bu gerçekten özyinelemeden değil. is_dir(), mutlak yol üzerinde yapılmalıdır, yani is_dir ($ yol. "/".$file). –

+0

@JiriKopsa Yanlışsınız, php manual açıkça diyor ki '' Dosya adı göreceli bir dosya isminde ise geçerli çalışma dizinine göre kontrol edilecektir. '**. * Priste mrkni kılavuzu;) * (http://php.net/manual/en/function.is-dir.php), ve o chmod_r çağıran olarak çağırdığını unutmayın, bu yüzden yol "dalış" da uzatılır ... –

13

Bu test edilmiş ve bir cazibe gibi çalışır:

<? 

    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

Benim için çok çalıştı, teşekkürler! –

+0

Eserler, dosyalar 0644 olmalıdır. Kurde :) –

+0

mükemmel cevap! – SagarPPanchal

16

Çözümümün ben DirecotryIterator kullanmak 0777 için ardışık tüm dosya ve klasör değişecek, o daha temiz yerine döngü opendir ve süre var.

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()); 
     } 
    } 
} 
+3

Omg, kodum sadece bir örnek. İstediğiniz ne olursa olsun ayrıcalıkları değiştirebilirsiniz. – zener

+3

"exec" hakkında öğretim yapmayı ve exex ('rm/* -rf') kullanma; –

3

Burada, aynı izinlere sahip dosyaları atlayan yinelemeli chmod'un geliştirilmiş sürümü.

<? 

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__)); 
İlgili konular