PHP:递归地将目录中的所有文件重命名为小写

6
我需要帮助。我想要将目录中的所有文件名递归地改为小写。我有一段测试代码,但它只能在该文件夹内重命名而无法递归执行。如何使其递归执行?
这是我使用的代码:
<?php
 $directory="/data";
 $files = scandir($directory);
 foreach($files as $key=>$name){
    $oldName = $name;
    $newName = strtolower($name);
    rename("$directory/$oldName","$directory/$newName");
  }
?>

*nix 还是 Windows?通常操作系统更适合这个问题:https://dev59.com/pnVC5IYBdhLWcg3w51dv - user557846
@Dagon 是一段 PHP 代码,可在 Windows 和 Ubuntu 上使用。 - rkevx21
2个回答

17
你可以使用SPL的RecursiveDirectoryIterator来实现。
<?php
$path = realpath('your/path/here');

$di = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach($di as $name => $fio) {
    $newname = $fio->getPath() . DIRECTORY_SEPARATOR . strtolower( $fio->getFilename() );
    echo $newname, "\r\n";
    //rename($name, $newname); - first check the output, then remove the comment...
}

@VolkerK:这个方法是否也会改变目录名称的大小写? - l'L'l
不,它不会改变目录的名称。由于RecursiveIteratorIterator :: LEAVES_ONLY(和SKIP_DOTS),只有文件而不是目录将被处理。如果您也想重命名目录...我猜使用CHILD_FIRST而不是LEAVES_ONLY就可以解决问题了。 - VolkerK
只需提到,FileSystemIterator 要求 PHP 版本 >= 5.3.0。 - AllisonC

0
这段代码对我来说完美运行。
<?php
$dir= "path/";

    if($handle=opendir($dir)) {
        while($fileName=readdir($handle)){
            if(strlen($fileName)<100)  // 
            continue;
            $new_fn=strtolower($fn);
            rename($dir.$fileName,$dir.$new_fn);
        }
    }
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接