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

时间:2015-02-18 20:30:38

标签: php ssh hosting server

我最近遇到了一个问题,无法获得解决方案,我的服务器中的1个文件夹中有100,000个图像,名为

/Images/

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

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

使用cpanel文件管理器我无法压缩这些文件,我无法打开Images文件夹它超时并且永远不会打开,即使使用filezilla和smartftp,Images文件夹只显示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吗?

感谢。

2 个答案:

答案 0 :(得分:4)

这应该适合你:

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

编辑:

从以下位置更改文件夹结构:

  

包含10张图片的X文件夹

为:

  

带X图像的10个文件夹

此脚本将X文件夹转换为X / 10文件夹,例如8139 - &gt; 813个文件夹。所以,如果你想转换8139 - &gt; 813运行它2x如果你想要8139 - &gt; 81运行3次。

注意:如果文件已存在,例如/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张图像| à1000个文件夹,例如每个文件夹10张图片
  • 与答案相同的配置
  • 图片大小:31'503字节
  • 脚本叫:2次:
    1. 1'000个文件夹 - &gt; 100
    2. 100个文件夹 - &gt; 10
  • 执行时间:29-33秒(平均值:31.29639005661秒)

答案 1 :(得分:0)

另一个解决方案,用(81390)文件将所有文件夹(8139)文件(10)解压缩到1个文件中i使用此。

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

$dir = "images/";

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

}

?>