Mover um arquivo para um diretório com mais de 7000 arquivos

6

Estou em um servidor Linux de hospedagem compartilhada do GoDaddy (hospedagem "ilimitada").

Eu tenho uma pasta com imagens de produtos para uma loja de comércio eletrônico que contém mais de 7000 imagens.

O GoDaddy me disse que não tenho permissão para ter mais de 1024 arquivos em um único diretório e que eu preciso reformatar a estrutura de pastas, o que não é possível, pois esse software é mantido e executado por um sistema de ponto de venda na loja de tijolo e argamassa do meu cliente.

Eu usei SSH e alterei as permissões na pasta para a qual estou movendo a imagem e a própria imagem para 777 e emiti o seguinte comando:

mv img.gif product_images/img.gif

e recebo o seguinte erro:

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

O arquivo não é "muito grande"; são apenas 49 bytes (é um gif 1x1)!

Se eu tentar arrastar + soltar o upload do Windows para o diretório via FTP, recebo os seguintes erros:

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

Eu tenho permissão para colocar arquivos no servidor ... é como eu coloquei o arquivo img.gif lá em primeiro lugar. O diretório existe. Eu posso ls seu conteúdo bem.

O cara de suporte anterior (que não está mais disponível) poderia fazer isso - eu não sei como.

Como faço para mover arquivos para este diretório muito teimoso? Alguma idéia?

    
por David Murdoch 08.06.2011 / 15:43

4 respostas

1

Pode haver um truque que você pode tentar, se o GoDaddy permitir hardlinks :

ln img.gif product_images/img.gif

Se a mensagem de erro é simplesmente enganosa (e é na verdade um erro "muitos arquivos"), em vez de um erro "sem espaço em disco"), isso provavelmente não funcionará. Mas se isso for bem sucedido, você terá img.gif idêntico tanto no diretório original quanto no subdiretório, mas os ponteiros do arquivo apontarão para o mesmo arquivo físico, portanto nenhum espaço adicional será usado (além do ponteiro).

Se tudo correr bem, você pode excluir com segurança o arquivo original e permanecerá no subdiretório:

rm img.gif

Se tudo mais falhar, baixe todos os arquivos novamente (dica: tar + gz para baixá-los muito mais rápido), exclua-os do site, reorganize-os (mais sobre isso abaixo) e, em seguida, reenvie-os.

Resolvendo o problema da raiz

Uma solução comum é criar estruturas de subdiretórios para os primeiros caracteres no nome do arquivo. Por exemplo:

images / widget001.png - > images / w / i / widget001.png

Você pode, então, escrever uma RewriteRule no aplicativo .htaccess para que seu aplicativo da web não seja violado. Ele ainda tentará baixar a imagem de images / widget001.png, mas o mecanismo de reescrita de URL exibirá imagens / w / i / widget001.png.

Você pode criar quantos níveis de subdiretórios forem necessários para obter o número de arquivos por diretório inativo. Isso funciona especialmente bem se os arquivos tiverem nomes gerados aleatoriamente. Se todos os nomes forem semelhantes (por exemplo, todos eles correspondem ao formato "img #####. Png"), você pode criar sua estrutura de diretórios com base em alguma outra parte do nome, em vez de usar as primeiras letras. / p>

NOTA: Você deve manter o nome completo do arquivo para facilitar a manutenção futura, em vez de renomeá-lo para images / w / i / dget001.png no exemplo anterior. Uma razão é que é muito mais fácil achatar e reconstruir a estrutura de diretórios se você descobrir que precisa aprofundar a estrutura de diretórios novamente mais tarde.

EDIT: +1 para baraboom , que também mencionou o subdiretório + URL reescrito enquanto escrevia minha resposta. :)

    
por 08.06.2011 / 18:27
6

Então, depois de googlar godaddy 1024 file limit e ler alguns resultados, parece que sua melhor opção seria encontrar um novo host.

Bloqueando isso, a maneira menos dolorosa que eu posso pensar em consertar o problema seria organizar logicamente os arquivos em subdiretórios e então usar as regras de reescrita do Apache para mapear os caminhos antigos para os novos caminhos. Isso pouparia você mudar qualquer coisa na aplicação real. O seguinte seria um exemplo:

1) Baixe o diretório para o seu computador local;

2) Organize os arquivos em subdiretórios, não deve ser muito ruim com apenas 7000 arquivos e o limite de 1024. Por exemplo, você poderia criar 36 sub-diretórios, um para cada letra do alfabeto e um para cada número, 0-9, e então colocar cada subconjunto de arquivos no subdiretório apropriado: o arquivo awhatever.gif entraria em um arquivo / 11que quer que fosse para 1 /, etc.

3) Crie / edite o arquivo .htaccess e crie uma regra de reescrita que mapeie qualquer solicitação para product_images / awhatever.gif para product_images / a / awhatever.gif.

O arquivo .htaccess seria parecido com isto:

RewriteEngine On
RewriteRule ^(.)([^/]+)$ $1/$1$2 [L]
    
por 08.06.2011 / 17:55
4

O GoDaddy lhe disse diretamente que não permite o que você deseja fazer. As páginas de ajuda do GoDaddy dizem que o que você quer fazer não é permitido. Eles até dizem que você receberá esses tipos de mensagens de erro se tentar fazer o que não tem permissão para fazer. E aqui está você, perguntando: "Como, apesar de ser dito que não posso pelo próprio GoDaddy, eu faço isso?".

O GoDaddy não permite que você faça isso. Encontre alguém que tenha, ou mantenha abaixo do limite de 1024 entradas de diretório.

    
por 08.06.2011 / 16:21
1

Contorne o problema criando uma CSS para as imagens do produto. Você reduzirá seu número de arquivos exponencialmente.

    
por 08.06.2011 / 17:02