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?
我想以递归方式设置文件夹和文件权限。文件夹应该得到750和文件644.我发现了这个并做了一些改编。这个有用吗?
<?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);
}
?>
5 个解决方案
#1
25
Why don't use find tool for this?
为什么不使用find工具呢?
exec ("find /path/to/folder -type d -exec chmod 0750 {} +");
exec ("find /path/to/folder -type f -exec chmod 0644 {} +");
#2
17
My solution will change all files and folder recursively to 0777. I use DirecotryIterator, it's much cleaner instead of opendir and while loop.
我的解决方案将递归地将所有文件和文件夹更改为0777.我使用DirecotryIterator,它更干净,而不是opendir和while循环。
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
14
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);
?>
#4
3
Here improved version of the recursive chmod that skips files with the same permissions.
这里是递归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__));
#5
2
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);
}
#1
25
Why don't use find tool for this?
为什么不使用find工具呢?
exec ("find /path/to/folder -type d -exec chmod 0750 {} +");
exec ("find /path/to/folder -type f -exec chmod 0644 {} +");
#2
17
My solution will change all files and folder recursively to 0777. I use DirecotryIterator, it's much cleaner instead of opendir and while loop.
我的解决方案将递归地将所有文件和文件夹更改为0777.我使用DirecotryIterator,它更干净,而不是opendir和while循环。
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
14
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);
?>
#4
3
Here improved version of the recursive chmod that skips files with the same permissions.
这里是递归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__));
#5
2
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);
}