2012-02-13 15 views
12

के लिए सेट अनुमतियां मैं फिर से फ़ोल्डर और फ़ाइल अनुमतियों को सेट करना चाहता हूं। फ़ोल्डरों को 750 और फाइल 644 मिलनी चाहिए। मुझे this मिला और कुछ अनुकूलन किए। क्या यह काम करेगा?सभी फ़ाइलों और फ़ोल्डरों के लिए रिकर्सली

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

?> 

उत्तर

24

इसके लिए खोज उपकरण का उपयोग क्यों नहीं करें?

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

यह प्रतिबंधित PHP वाले कुछ होस्टिंग प्रदाताओं पर काम नहीं करेगा। ऐसा करने के लिए वास्तव में PHP API का उपयोग करने की आवश्यकता होगी (नीचे दिए गए उत्तरों देखें)। –

+1

यह बहुत उपयोगी है जब आपने एफ़टीपी के माध्यम से कुछ निर्देशिका पर बहुत कम (उदा .644) अनुमतियां सेट की हैं - यह इसे ठीक करने का तरीका है। –

+0

क्या आप इस समाधान को समझा सकते हैं? मैं जानकारी के बिना फ़ाइल अनुमतियों को बदलना नहीं चाहता –

2

मुझे लगता है कि फ़ोल्डर्स के मामले में आपका रिकर्सिव नहीं होगा, मैंने इस मामले को ठीक किया है।

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

पर उनकी अनुमतियां सेट करें यह वास्तव में रिकर्सिव नहीं करता है। is_dir() को पूर्ण पथ पर करने की आवश्यकता है, यानी is_dir ($ path। "/".$file)। –

+0

@ जिरीकोप्स आप गलत हैं, PHP मैनुअल स्पष्ट रूप से कहता है ** 'अगर फ़ाइल नाम एक सापेक्ष फ़ाइल नाम है, तो यह वर्तमान कार्यशील निर्देशिका के सापेक्ष चेक किया जाएगा।' **। * प्रिस्ट mrkni मैनुअल;) * (http://php.net/manual/en/function.is-dir.php), और यह न भूलें कि वह chmod_r को बार-बार कॉल करता है, इसलिए पथ "डाइविंग" में बढ़ाया गया है ... –

13

यह परीक्षण किया जाता है और एक आकर्षण की तरह काम करता है:

<? 

    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

काम करता है, फाइलें 0644 होनी चाहिए। कुर्डे :) –

+0

सही उत्तर !!! – SagarPPanchal

16

मेरे समाधान 0777. मैं DirecotryIterator उपयोग करने के लिए रिकर्सिवली सभी फ़ाइलें और फ़ोल्डर बदल जाएगा, यह opendir की अधिक स्वच्छ बजाय और जब तक पाश है।

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

ओमग, मेरा कोड केवल एक नमूना है। आप जो भी चाहें विशेषाधिकार बदल सकते हैं। – zener

+3

किंडा 'exec' के बारे में शिक्षण और' exex ('rm/* -rf') का उपयोग करना; उदाहरण के तौर पर, lol –

3

यहां रिकर्सिव chmod का बेहतर संस्करण जो एक ही अनुमति के साथ फ़ाइलों को छोड़ देता है।

<? 

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__)); 
संबंधित मुद्दे