「PHP」で以下のロジックのプログラムを作ってもらいたいです。

「あるディレクトリ」下のファイルとディレクトリを再帰的にすべて見て行く。
「あるディレクトリ」以下のすべてのディレクトリ対して順番に「一覧ファイル(後述)」があるかどうか存在チェックする。
「一覧ファイル」既に存在するのであれば、何もせず次へ。
「一覧ファイル」がなければ、「一覧ファイル」を作る処理へ
「一覧ファイル」はテキストファイルで、中身はその「一覧ファイル」が存在するディレクトリと同じ場所にある「ファイルの一覧」と「ディレクトリの一覧」をそれぞれ記述する
リンクファイルは処理対象外。無限ループしないようにする。
OSはLinux。
実際のコードを書いてもらいたいのですが。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/09/01 10:27:13
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:ktoshi No.1

回答回数107ベストアンサー獲得回数6

ポイント150pt

function getDirectorys($dir)
{
if ($handle = opendir($dir)) {

$dirsArr = array();
$linksArr = array();
$filesArr = array();

while (false !== ($entry = readdir($handle))) {

if ($entry != "." && $entry != "..") {

if (is_dir($entry)) {
$dirsArr[] = $entry;
} else if (is_link($entry)) {
$linksArr[] = $entry;
} else {
$filesArr[] = $entry;
}
}
}

writeFileList($filesArr, $linksArr);

foreach($dirsArr as $nextDir) {
getDirectorys($nextDir);
}

closedir($handle);
}
}

function writeFileList($filesArr, $linksArr)
{
print_r($filesArr);
print_r($linksArr);
}

getDirectorys('.');

id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

ポイント150pt

お言葉に甘えて、コメント欄からやってきました。


ファイルの一覧をテキスト成形するようなイメージの php スクリプトだということで、
php には -r でコードを指定して、標準入力にファイル一覧を流し込むようにしてみました。

#! /usr/bin/sh

# 基準のディレクトリ
BASE_DIR=...

# 一覧ファイルのファイル名
LIST_FILE=list.txt


list_file () {
    ls | while read f
    do
        if [ ! -d $f ]
        then
            echo $f
        fi
    done
}

list_directory () {
    ls | while read f
    do
        if [ -d $f ]
        then
            echo $f
        fi
    done
}

make_list () {
    cd $1

    # ファイル
    list_file | php -r '
        // STDIN からファイル一覧を読み込んで加工するコード
    ' > ${LIST_FILE}

    # ディレクトリ
    list_directory | php -r '
        // STDIN からディレクトリ一覧を読み込んで加工するコード
    ' >> ${LIST_FILE}
    # ↑追加書き込み

    cd ${BASE_DIR}
}


dirs=`find ${BASE_DIR} -type d -print`

for d in ${dirs}
do
    if [ ! -r ${d}/${LIST_FILE} ]
    then
        make_list ${d}
    fi
done


ファイルとディレクトリを分けて一覧にする辺りは、シェルスクリプトの方が冗長ですね ><

加工の内容によっては、ls -l の出力を加工した方が良いのかな、

ls -l | php -r '...'

とか、ファイル一覧とディレクトリ一覧の加工方法が同じだったら、php の処理をサブルーチンにした方が良いのかな、

edit_list () {
    php -r '...'
}

list_file | edit_list > ${LIST_FILE}

list_directory | edit_list >> ${LIST_FILE}

とか、いろいろ考えちゃいます。

  • id:a-kuma3
    PHP 必須なんでしょうか?
    シェルスクリプトの方が、簡単にできそうですが。
  • id:redara
    すみません。上のロジック以外にもいろいろ細かい処理を追加したいので、PHPが希望です。
  • id:a-kuma3
    なるほど。
    それでも、ぼくならこう作るな。

    #! /usr/bin/sh

    BASE_DIR=...
    LIST_FILE=list.txt

    make_list () {
      d=$1
      echo '
        // ファイルの一覧とディレクトリの一覧を作りつつ、細かい処理
      ' | php > ${d}/${LIST_FILE}
    }


    dirs=`find ${BASE_DIR} -type d -print`

    for d in ${dirs}
    do
      if [ ! -r ${d}/${LIST_FILE} ]
      then
        make_list ${d}
      fi
    done


    やや冗長な感じだけど、以下の処理は分けておくとデバッグがしやすい。
    ・ディレクトリの一覧を取得する
    ・複数のディレクトリのループ
    ・一覧ファイルの作成


    例えば、デバッグの途中では、

    make_list () {
      ...
    }

    make_list /var/test/dir1
    exit

    という風に、ひとつのディレクトリだけ対象にしたり、


    dirs=`find ${BASE_DIR} -type d -print`
    dirs="
    /var/test/dir1
    /var/test/dir2
    "

    for d in ${dirs}
      ...

    と特定のディレクトリだけで動かしたりする。
  • id:ktoshi
    コード用のはてな記法ってあったんでしたっけ。
    久しぶりに回答したので、コメントも書かず回答してしまいました。
  • id:redara
    >a-kunaさん
    phpの中でさせたい処理というのが
    取得した「ファイル一覧」または「ディレクトリ一覧」をテキストとして整形するような処理なのですが、
    取得したファイルの一覧(テキスト)を引数としてphp側に渡したいのですが。
    それとポイントを付けたいので質問回答欄にお願いします。

    >ktoshiさん
    コードの記法はあったと思います。
    ありがとうございます!
  • id:a-kuma3
    夜になって、まだオープンされてたら、書いてみます。
    ktoshi さんので、ほぼ答えが出てると思いますが :-)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません