gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 01:00:29 25 4
gpt4 key购买 nike

我最近遇到了一个问题,无法找到解决方案,我的服务器中的 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。我用 array_chunk() 创建了 10 个 block 在包含所有文件的数组中。所以我转换了数组,例如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 秒)

关于php - 使用php将文件夹上的文件拆分为更多文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28593309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com