0

私はこれらのファイルを/public_html/ディレクトリに持っています:

0832.php
1481.php
2853.php
3471.php
index.php

そして、index.phpを除いて、すべてのXXXX.php(常に4桁の形式)をディレクトリ/tmp/に移動したいと思います。正規表現とループでそれを行う方法は?

または、すべてのファイル(index.phpを含む)を最初に/ tmp /に移動し、後でindex.phpのみを/public_html/に戻すのはどうでしょうか。CPUの消費量が少ないと思います。

最後に、PHPを使用してファイルを移動するこのチュートリアルを見つけました:http ://www.kavoir.com/2009/04/php-copying-renaming-and-moving-a-file.html

しかし、ディレクトリ内のすべてのファイルを移動するにはどうすればよいですか?

4

4 に答える 4

2

FilesystemIteratorで使用できますRegexIterator

$source = "FULL PATH TO public_html";
$destination = "FULL PATH TO public_html/tmp";

$di = new FilesystemIterator($source, FilesystemIterator::SKIP_DOTS);
$regex = new RegexIterator($di, '/\d{4}\.php$/i');

foreach ( $regex as $file ) {
    rename($file, $destination . DIRECTORY_SEPARATOR . $file->getFileName());
}
于 2012-11-05T15:32:04.537 に答える
1

いくつかの単純な文字列照合を行うだけでよいので、正規表現は実際にはこれにはやり過ぎです。

$dir = 'the_directory/';

$handle = opendir($dir) or die("Problem opening the directory");

while ($filename = readdir($handle) !== false)
{
    //if ($filename != 'index.php' && substr($filename, -3) == '.php')
    //   I originally thought you only wanted to move php files, but upon
    //    rereading I think it's not what you really want
    //    If you don't want to move non-php files, use the line above,
    //    otherwise the line below
    if ($filename != 'index.php')
    {
        rename($dir . $filename, '/tmp/' . $filename);
    }
}

次に、質問について:

または、すべてのファイル(index.phpを含む)を最初に/ tmp /に移動し、後でindex.phpのみを/public_html/に戻すのはどうでしょうか。CPUの消費量が少ないと思います。

それは可能であり、おそらくあなたのCPUでは少し簡単でしょう。ただし、これが問題にならない理由はいくつかあります。まず、PHPを介してこれを実行することにより、すでに非常に非効率的な方法でこれを実行しているため、PHPの外部で実行する意思がない限り、この時点でCPUにかかる負担を実際に確認するべきではありません。第二に、それはより多くのディスクアクセスを引き起こし(特にソースとデスティネーションディレクトリが同じディスクまたはパーティション上にない場合)、ディスクアクセスはCPUよりもはるかに遅くなります。

于 2012-11-05T15:06:22.183 に答える
1

実際、私はreaddirのマニュアルページにアクセスしましたが、最初に読むべきコメントは次のとおりです。

loop through folders and sub folders with option to remove specific files. 

<?php 
function listFolderFiles($dir,$exclude){ 
    $ffs = scandir($dir); 
    echo '<ul class="ulli">'; 
    foreach($ffs as $ff){ 
        if(is_array($exclude) and !in_array($ff,$exclude)){ 
            if($ff != '.' && $ff != '..'){ 
            if(!is_dir($dir.'/'.$ff)){ 
            echo '<li><a href="edit_page.php?path='.ltrim($dir.'/'.$ff,'./').'">'.$ff.'</a>'; 
            } else { 
            echo '<li>'.$ff;    
            } 
            if(is_dir($dir.'/'.$ff)) listFolderFiles($dir.'/'.$ff,$exclude); 
            echo '</li>'; 
            } 
        } 
    } 
    echo '</ul>'; 
} 

listFolderFiles('.',array('index.php','edit_page.php')); 
?>
于 2012-11-05T15:08:39.260 に答える
1

最善の方法は、ファイルシステムを介して直接実行することですが、PHPで絶対に実行する必要がある場合は、このような方法で目的の処理を実行できます。明らかに、パスが正しくなるようにパスを変更する必要があります。これは、public_htmlディレクトリに他のファイルが存在する可能性があることを前提としているため、4つの数字を持つファイル名のみを取得することに注意してください。

$d = dir("public_html");

while (false !== ($entry = $d->read())) {
    if($entry == '.' || $entry == '..') continue;
    if(preg_match("@^\d{4}$@", basename($entry, ".php")) {
        // move the file
        rename("public_html/".$entry, "/tmp/".$entry));
    }
}

$d->close();
于 2012-11-05T15:09:53.267 に答える