使用 php 将文件夹中的文件拆分为更多文件夹

Split files on folders into more folders with php

我最近遇到了一个问题,无法找到解决方案,我在名为

的服务器的 1 个文件夹中有 100,000 张图片
/Images/

在这个文件夹里有 100,000 张像这样的图片:

/Images/image1.jpg
/Images/image2.jpg
/Images/image3.jpg
...

使用 cpanel 文件管理器我无法压缩这些文件并且我无法打开图像文件夹它加班并且永远不会打开,即使使用 filezilla 和 smartftp 图像文件夹也只显示 10,000 张图像,所以我现在最好的解决方案是拆分将文件夹分成更多文件夹并将它们作为部分压缩。

我希望它像这样完成:

/Images/part1/image1.jpg
/Images/part1/image2.jpg
/Images/part1/image3.jpg
...

/Images/part2/image10001.jpg
/Images/part2/image10002.jpg
/Images/part2/image10003.jpg
...

...

所以最后我将在每个文件夹中有 10 个文件夹,我有 10,000 张图像。

我可以使用 PHP 来做到这一点吗?

谢谢。

这应该适合你:

1。我使用 glob() 获取目录中与模式匹配的所有文件

2。我从包含所有文件的数组中创建了 10 个 array_chunk() 块。所以我转换了数组,例如Array ( [0] => ... [2000] => ...) 到一个如下所示的数组:Array ( [0] => Array ( [0] => ... [9] => ...) )

3。我创建了与 mkdir()

一样多的文件夹

4。最后我用 rename()

移动了目录中的所有文件
<?php

    //Configuration
    $folderPattern = "part";
    $chunkSize = 10;
    $path = "images/";

    //get images
    $files = glob($path . "*.*");
    $chunks = array_chunk($files, $chunkSize);
    
    //create folders
    for($i = 1; $i <= count($chunks); $i++) {
        if(!file_exists($path . $folderPattern . $i))
            mkdir($path . $folderPattern . $i, 0700);
    }

    //move images
    for($i = 1; $i <= count($chunks); $i++) {
        for($x = 0; $x < count($chunks[$i-1]); $x++) {
            rename($path . basename($chunks[$i-1][$x]), $path . $folderPattern . $i . "/" . basename($chunks[$i-1][$x])); 
            echo $path . basename($chunks[$i-1][$x]) . " -> " . $path . $folderPattern . $i . "/" . basename($chunks[$i-1][$x]) . "<br />";
        }
    }

?>

根据您对基本 php 的了解,您可能需要研究一下:

已测试答案:

  • 有 10'000 张图像
  • 与答案中的配置相同
  • 图像大小:31'503 字节
  • 执行时间:15-17 秒(平均:16.189925909042 秒)

编辑:

要更改您的文件夹结构来自:

X folders with 10 images

至:

10 folders with X images

此脚本将 X 文件夹转换为 X/10 文件夹,例如8139 -> 813 个文件夹。因此,如果你想将 8139 -> 813 运行 转换为 2x,如果你想将 8139 -> 81 运行 转换为 3x.

注意:如果文件已经存在,例如/images/part1/xy.jpg 并且您想将文件移动到此文件夹中,它会自动将 - TEMP-[random number] 附加到名称中,这样它就不会丢失。例如,如果您现在要将文件 /images/partXY/xy.jpg 移动到上面的文件夹中,文件将重命名为:/images/part1/xy.jpg - TEMP-906222766。这样您就可以轻松找到这些文件并将其重命名为您想要的名称。

(如果您想对此代码进行完整解释,请在评论中告诉我)

<?php

    //Since it can take a few seconds more than 30 and default is (mostly) 30
    set_time_limit(120);


    //Configuration
    $path = "images/";
    $chunkSize = 10;
    
    //Get all dirs
    $dirs = glob($path . "*");

    //Get all files
    foreach($dirs as $dir)
        $files[] = glob($dir . "/*.*");
    
    //Define MAX folders
    $files = array_chunk($files, $chunkSize);

    
    foreach($files as $key => $innerArray) {
        $baseFolder = dirname(str_replace($path, "", array_column($innerArray, 0)[0]));
        
        for($i = 1; $i < count($innerArray); $i++) {
            foreach($files[$key][$i] as $file) {
                if(file_exists($path . $baseFolder . "/" . basename($file)))
                    rename($file, $path . $baseFolder . "/" . basename($file) . " - TEMP-" . mt_rand());
                else
                    rename($file, $path . $baseFolder . "/" . basename($file));
                
                echo $file . " -> " . $path . $baseFolder . "/" . basename($file) . "<br />";
            }
            
            //Delete dir
            rmdir($path . str_replace($path, "", dirname($files[$key][$i][0])));
            echo "<br /><br />Removed: " . $path . str_replace($path, "", dirname($files[$key][$i][0])) . "<br /><br />";
        }

    }

?>

已测试答案:

  • 有 10'000 张图片 | à 1'000 个文件夹,例如每个文件夹 10 张图片
  • 与答案中的配置相同
  • 图像大小:31'503 字节
  • 脚本调用:2 次:
    1. 1'000 个文件夹 -> 100
    2. 100 个文件夹 -> 10
  • 执行时间:29-33 秒(平均:31.29639005661 秒)

将所有文件夹 (8139) 文件 (10) 提取到 1 个文件中的另一个解决方案,我使用了 (81390) 个文件。

注意:这会将所有文件夹的文件提取到包含所有文件的 1 个文件夹中

$dir = "images/";

foreach(glob($dir . "*") as $file) 
{
       foreach(glob($file . "/*") as $inside)
       {
           rename("$inside","$dir" . basename($inside));
       }
       rmdir($file);

}

?>