エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


フォルダを指定してファイルのパーミッションを変更するプログラム

      2014/09/12

フォルダを指定しパーミッションを変更するプログラムを作ってみた

 

プログラムを作った経緯とプログラムソース

 
とあるサーバで、ファイルのパーミッションをまとめて変更したい、という必要性があり、プログラムを作成してみました。
 
大したものではないですが、せっかく作りましたので、もし他の人も何か参考になるのならばと思ってここにアップしてみることにしました。
 
——————

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>ファイルのパーミッション変更</title>
</head>

<form action="" method="post">
<input type="hidden" name="mode"      value="submit">
フォルダ名:<input type="text"   name="dir_name"><br />
※相対パスで入力し、最後の「/」は入力しない<br />
 <br />
パーミッション:<input type="text"   name="permission"><br />
※最初の「0」は入力しない<br />
<input type="submit" name="Chmod実行"><br />
</form>

<?php

if ( isset ( $_POST["mode"] ) ) {
  if ( $_POST["mode"] == "submit" ) {

    if ( !$_POST["dir_name"] ) {
      echo " <br />";
      echo "フォルダ名を入力してください。<br />";
    } elseif ( !is_numeric ( $_POST["permission"] ) ) {
      echo " <br />";
      echo "パーミッションは数値で入力してください。<br />";
    } else {
      echo " <br />";
      echo "■ファイル一覧<br />";

      $dir_neme = $_POST["dir_name"] . "/";

      if ( $dir = opendir ( $dir_neme ) ) {
        while ( ( $file = readdir ( $dir ) ) !== false ) {
          if ( $file != "." && $file != ".." ) {
            $path = $dir_neme . $file;
            if ( is_file ( $path ) ) {
              echo $file . "<br>\n";
              $perm = sprintf ( "%04d", $_POST["permission"] );
              echo $perm . "<br>\n";
              $res = chmod ( $path, octdec ( $perm ) );
            }
          }
        }
        closedir ( $dir );
      }
    }
  }
}

?>

</body>
</html>

——————
 
 

サンプルソースの使い方

 
上記のソースプログラムを適当なファイル名のファイルにコピペして、サーバにアップして、そのファイルにアクセスすると下記のような画面が表示されます。
 
20140911_php_01
 
「フォルダ名」にフォルダ名を入力します。
相対パスで指定し、フォルダ名の最後に「/」は不要です。
 
「パーミッション」には指定したいパーミッションを入力します。
パーミッションの設定は「0755」「0666」など最初に「0」を付ける必要がありますが、その部分は自動付与しますので、入力は必要ありません。
 
「Chmod実行」ボタンをクリックすると、「フォルダ名」で指定したフォルダの中のファイルのパーミッションを「パーミッション」で指定したものに変更します。
 
フォルダのパーミッションは変更しません。
 
 

プログラムの解説

 
プログラムの解説、というほどたいそうな処理を書いているわけではありませんが、解説をしていきます。
 
35行目の「poendir」でフォルダを開いて、36行目の「readdir」で 1つずつのファイルを取得し、37行目で「.」「..」を排除し、39行目の「is_file」でファイルであることを確認(フォルダを排除)します。
42行目の「chmod」でパーミッションを変更します。
 
また、見ていただいて分かる通り、入力チェックは最低限しか行っていませんので、正しくない値を入れた場合は、想定外の不具合につながる可能性もあります。
 
さらに、サニタイジングも行っていませんので、使い終わったら速やかにプログラムファイルを削除しておく方がいいでしょう。
 
 

サンプルソースの注意点

 
このプログラムは想定通りの結果が得られない場合が多々あります。
下記のような場合は、サーバの設定によって実行できないものになりますので、あきらめるしかありません。
 
・chmod関数が使えない
chmod関数は、使い方を間違えるとサーバ全体に大きな影響を与えかねない関数であることから、これらの関数を利用できないようにしているサーバもあります。
 
・ファイルの権限が違う
サーバで動いているプログラムにはそれぞれ権限があり、FTPでアップロードしたファイルと、PHPのプログラムで生成されたファイルと、それぞれ違うユーザが割り当てられているサーバもあります。
その場合は、作成したユーザが違うためにプログラム上からパーミッションの変更ができない場合があります。
 
 
また、このプログラムは、パーミッションを変えるだけですが、設定に失敗するとシステム全体に大きな影響を与えてしまう可能性もありますので、まずは、テスト用のファイルで実験をしてみてください。
 
例えば、下記の様にフォルダとファイルを生成し、「test1」フォルダを指定して実験してみるとかテストファイルで試してみてください。
/test
/test/chmod_php.php
/test/test1/
/test/test1/01.txt
/test/test1/02.txt
/test/test1/03.txt
/test/test1/04.txt
/test/test1/05.txt
 
※「chmod_php.php」が上記サンプルのプログラムとします。

 - PHP・Smarty・ECCUBE

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

ECCUBEの商品一覧ページのSEO対策!rel=”next” rel=”prev”を設定

Googleは関連あるページはその旨明示するよう求めています。ECCUBEの商品一覧ページでその求めに応じるための「rel=”next”」「rel=”prev”」について解説します。

PHPで特定の日間の日付を for、strtotimeで表示する

ある特定の間の日付の情報を for文、strtotimeを使って作成し、その解説をしています。

リダイレクトループが原因で「ERR_TOO_MANY_REDIRECTS」「このページを表示できません」が出たときの対策12事例+α

リダイレクトループ、自動転送設定ループの原因の解説とその対応方法を含め事例 12例を挙げて説明。

SEO対策用タイトル、ディスクリプションの文字数カウントツール

SEO対策に使える文字数カウントツールで文字数の条件の説明も行っています。

AdminerはphpMyAdmin代替のデータベース管理ツール

AdminerはphpMyAdminとほぼ同機能のデータベース管理ツール。PHP 1ファイルのため設置が非常に簡単で軽快に動作し、phpMyAdminの置き換えで使うのも問題なし。

配列の値をテキスト表示する際に「、」でつなげるときの処理方法の一例
配列の値をテキスト表示する際に「、」でつなげるときの処理方法の一例

配列の値を「、」でつないで出力する際、単純にforeachで繰り返し処理をすると「イヌ、サル、キジ、」となるが文字列最後の「、」を出力しない方法を3つ解説している。

PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較
PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較

PHPからWebサイトにアクセスしてHTMLを取得、APIにアクセスして情報を取得する場合は、cURLがオススメ。file_get_contentsでも可能だがエラー制御に難がありトラブルのもとになる。

乱数発生器(パスワード生成サービス)がバージョンアップで高速化!
乱数発生器(パスワード生成サービス)がバージョンアップで高速化!

乱数やパスワードを生成する乱数発生器を高速化!重複しない10桁、20桁の文字列を10万件、20万件と生成することも可能!イベントのキャンペーンのシリアルコードなどにも利用可能!

数値がMySQLのint(11)に保存できない!PHPの変数が本当にint型か確認!
数値がMySQLのint(11)に保存できない!PHPの変数が本当にint型か確認!

PHPでintegerとdoubleが混在するような計算をする場合は要注意!計算結果が整数値であっても途中で使用する変数にdoubleの値が入っているときは計算結果がintegerではない場合があります。

ECCUBEのポイント設定、ポイント付与率を一括で変更する方法解説

ECCUBEの商品個別に設定してあるポイントを一括で変更する方法を解説。ECCUBEには商品個別のポイントを一括して変更する機能がありません。SQLを作成して一括置換!