将文件移动到包含超过 7000 个文件的目录中

将文件移动到包含超过 7000 个文件的目录中

我在 GoDaddy 共享托管 Linux 服务器(“无限制”托管)上。

我有一个文件夹,其中包含电子商务商店的产品图片,其中包含 7000 多张图片。

GoDaddy 告诉我不是允许在单个目录中拥有超过 1024 个文件,我需要重新格式化文件夹结构,但这是不可能的,因为该软件是由我客户实体店的销售点系统维护和运行的。

我已经通过 SSH 登录并将要移动图像的文件夹和图像本身的权限更改为 777,然后发出以下命令:

mv img.gif product_images/img.gif

我收到以下错误:

mv: cannot move 'img.gif' to 'product_images/img.gif': File too large

该文件不是“太大”;它只有 49 个字节(它是一个 1x1 gif)!

如果我尝试通过 FTP 将上传从 Windows 拖放到目录中,我会收到以下错误:

An error occurred copying a file to the FTP Server. Make sure you have permission to put files on the server.

Details:
200 TYPE is now 8-bit binary
227 Entering Passive Mode (184,168,167,92,197,60)
553-Can't open that file: File too large
553 Rename/move failure: no such file or directory

我确实有权限将文件放到服务器上...这就是我首先将 img.gif 文件放到服务器上的方式。该目录确实存在。我可以ls正常访问其内容。

以前的支持人员(不再可用)可以做到这一点 - 我只是不知道该怎么做。

我该如何将文件移动到这个非常顽固的目录中?有什么想法吗?

答案1

如果 GoDaddy 允许,你可以尝试一个技巧硬链接

ln img.gif product_images/img.gif

当然,如果错误消息只是误导性的(实际上是“文件太多”错误,而不是“磁盘空间不足”错误),这可能仍然不起作用。但如果成功,您将在原始目录和子目录中拥有相同的 img.gif,但文件指针将指向同一个物理文件,因此不会使用额外的空间(指针除外)。

如果一切顺利,您可以安全地删除原始文件,而子目录中的文件将保留:

rm img.gif

如果其他方法都失败了,请再次下载所有文件(提示:使用 tar+gz 可以更快地下载它们),从网站上删除它们,重新组织它们(更多信息见下文),然后重新上传它们。

解决根本问题

一种常见的解决方案是为文件名的前几个字符创建子目录结构。例如:

图片/widget001.png --> 图片/w/i/widget001.png

然后你可以编写一个 .htaccess重写规则所以你的 web 应用不会崩溃。它仍会尝试从 images/widget001.png 下载图像,但 URL 重写引擎将改为提供 images/w/i/widget001.png。

您可以根据需要创建任意多级子目录,以减少每个目录中的文件数量。如果文件的名称是随机生成的,这种方法尤其有效。如果所有名称都相似(例如,它们都符合“img#####.png”格式),您可以根据名称的其他部分创建目录结构,而不是使用前几个字母。

注意:为了便于将来维护,您应该保留完整文件名,而不是像上例中那样将其重命名为 images/w/i/dget001.png。原因之一是,如果您发现以后需要再次深化目录结构,那么扁平化和重建目录结构会容易得多。

编辑:+1 至巴拉布姆,在我写答案的时候也提到了子目录+URL 重写。:)

答案2

因此,在谷歌搜索 godaddy 1024 文件限制并阅读了一些结果后,似乎最好的选择可能是寻找一个新的主机。

除此之外,我能想到的解决问题最省事的方法是将文件逻辑地组织到子目录中,然后使用 Apache 的重写规则将旧路径映射到新路径。这样可以避免在实际应用程序中更改任何内容。以下是一个例子:

1)将目录下载到本地电脑;

2) 将文件组织到子目录中,在只有 7000 个文件和 1024 个限制的情况下,这应该不会太糟糕。例如,您可以创建 36 个子目录,每个字母一个,每个数字一个,0-9,然后将每个文件子集放入相应的子目录中:文件 awhatever.gif 将放入 a/,文件 11whatever 将放入 1/,等等。

3)创建/编辑.htaccess 文件并创建一个重写规则,将对 product_images/awhatever.gif 的任何请求映射到 product_images/a/awhatever.gif。

.htaccess 文件看起来像这样:

RewriteEngine On
RewriteRule ^(.)([^/]+)$ $1/$1$2 [L]

答案3

GoDaddy 已经直接告诉您,它不允许您想要做的事情。 GoDaddy 帮助页面告诉您,您想要执行的操作不被允许。 他们甚至告诉你,如果你尝试做你不被允许做的事情,你就会收到这些错误消息。而你却在问,“尽管 GoDaddy 本身告诉我不能这样做,我该怎么做?”

GoDaddy 不允许您这样做。 寻找其他可以做到这一点的人,或者将目录条目数保持在 1024 个限制以下。

答案4

通过创建一个来解决这个问题CSS 精灵表用于产品图像。您将成倍地减少文件数量。

相关内容