0

我在 /public_html/ 目录中有这些文件:

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

我想将所有这些XXXX.php(总是 4 位格式)移动到目录 /tmp/,除了 index.php。如何使用 reg-ex 和循环来做到这一点?

或者,如何先将所有文件(包括 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

事实上 - 我去了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 回答
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 回答