【问题标题】:Split files on folders into more folders with php使用php将文件夹上的文件拆分为更多文件夹
【发布时间】:2015-04-20 00:38:04
【问题描述】:

我最近遇到了一个问题,无法找到解决方案,我的服务器的 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. 我可以用 PHP 做到这一点吗? 发现第一个错误! image10001.jpg?
  • 感谢您指出这一点.. 我在 php 方面不太好.. 我什至无法开始自己..
  • 我将从这里开始php.net/opendir 打开目录句柄并开始浏览文件。 Perl 实际上可能在这方面做得更好,但 PHP 也可以。
  • 您也可以使用 system() 或 exec() 像 shell 脚本一样编写 PHP 脚本,或者您也可以编写 bash 脚本来执行此操作。有很多方法可以给这个皮肤上皮,但你可能应该开始研究它,如果你遇到困难,问一个更具体的问题,这个问题太宽泛了。
  • 是的 .. 这是一个好的开始,我可以打开新目录 .. 但我如何将第 10,000 张图像复制到该目录 ..

标签: php ssh hosting server


【解决方案1】:

这应该适合你:

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

2。我用 array_chunk() 从所有文件的数组中创建了 10 个块。所以我转换了数组,例如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 的了解,您可能需要了解以下内容:

答案测试:

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

编辑:

要更改文件夹结构:

X 个文件夹,包含 10 张图片

到:

10 个包含 X 张图片的文件夹

此脚本将 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。因此,您可以轻松发现这些文件并将其重命名为您想要的名称。

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

<?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 秒)

【讨论】:

  • @MadianMalfi 不客气!是的,我也很感兴趣,它是否适用于 100k 图像以及它的运行速度有多快。 (只需根据您的需要配置所有内容)然后让我知道它是否有效
  • 它确实有效,而且速度非常快,但我现在有 8139 个部分文件夹.. 不知道出了什么问题.. 我现在如何将所有目录合并回 1 :(
  • @MadianMalfi 将所有目录合并回 1 是什么意思?所以现在你有文件夹 part1 ... part8139,每个文件夹有 10 张图片?
  • 正是我想要相反的 .. 10 个文件夹,每个文件夹最多 10k 或其他什么 .. 哈哈.. 谢谢你的帮助 :) ..
  • 我想我应该再次合并所有文件并编辑 $chunkSize = 10;到 10000 .. 那么它会工作.. 对吗?
【解决方案2】:

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

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

$dir = "images/";

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

}

?>

【讨论】:

    猜你喜欢
    • 2018-05-29
    • 2017-05-20
    • 2014-08-14
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2019-01-18
    相关资源
    最近更新 更多