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

Dav*_*och 6 linux ssh bash web-hosting godaddy

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

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

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

我已经通过 SSH 连接并更改了我要将图像移动到的文件夹的权限,并将图像本身更改为 777 并发出以下命令:

mv img.gif product_images/img.gif
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

mv: cannot move 'img.gif' to 'product_images/img.gif': File too large
Run Code Online (Sandbox Code Playgroud)

文件不是“太大”;它只有 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
Run Code Online (Sandbox Code Playgroud)

我确实有权将文件放在服务器上……这是我如何将 img.gif 文件放在首位的。该目录确实存在。我可以ls它的内容就好了。

以前的支持人员(不再可用)可以做到 - 我只是不知道如何做到。

我怎样才能将文件移动到这个非常顽固的目录中?有任何想法吗?

bar*_*oom 6

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

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

1) 将目录下载到本地计算机;

2) 将文件组织到子目录中,只有 7000 个文件和 1024 个限制应该不会太糟糕。例如,您可以创建 36 个子目录,每个字母对应一个,每个数字对应一个,0-9,然后将文件的每个子集放入适当的子目录:文件 awhatever.gif 将放入 /,文件11 将进入 1/ 的任何内容,等等。

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

.htaccess 文件看起来像这样:

RewriteEngine On
RewriteRule ^(.)([^/]+)$ $1/$1$2 [L]
Run Code Online (Sandbox Code Playgroud)


rob*_*rob 1

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

ln img.gif product_images/img.gif
Run Code Online (Sandbox Code Playgroud)

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

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

rm img.gif
Run Code Online (Sandbox Code Playgroud)

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

解决根本问题

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

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

然后,您可以编写 .htaccess RewriteRule,这样您的 Web 应用程序就不会中断。它仍然会尝试从 images/widget001.png 下载图像,但 URL 重写引擎将提供 images/w/i/widget001.png。

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

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

编辑:+1 to baraboom,他在我写答案时还提到了子目录+URL重写。:)