Como encontrar arquivos e imagens órfãos que não estão vinculados a partir de nenhuma folha de estilo css ou de qualquer nó?

21

Existe uma maneira de listar todos os arquivos não utilizados que residem dentro do sistema de arquivos público e dentro de um diretório de temas e listá-los, ou talvez até mesmo ter uma opção para excluí-los automaticamente?

Quero dizer arquivos que não estão atualmente vinculados a partir de nenhuma folha de estilo css ou de qualquer nó.

camcam
fonte
Também gostaria de saber a resposta, obrigado por postar a pergunta!
NPC
Você está se referindo a arquivos carregados com um campo (como ImageField) ou arquivos em geral (carregados via IMCE)? Eu não acho que você pode acompanhar os envios de IMCE sem procurar referências no corpo de cada nó.
Chaulky
Sim, estou enviando via IMCE. Eu esperava que houvesse um módulo que fizesse o que você disse: nós de varredura para encontrar referências de imagem e, em seguida, referências internas do drupal (sem domínio) examinam diretórios relevantes e comparam os dois para encontrar arquivos não utilizados. Talvez algo semelhante seja feito com links em um módulo existente para encontrar links quebrados. Então eu pensei que talvez exista módulo similar para imagens, mas talvez não ..
CamCam

Respostas:

14

Você pode encontrar arquivos órfãos executando a seguinte consulta do MySQL:

SELECT fm.*
FROM file_managed AS fm
LEFT OUTER JOIN file_usage AS fu ON (fm.fid = fu.fid)
LEFT OUTER JOIN node AS n ON (fu.id = n.nid)
WHERE fu.type = 'node' AND n.nid IS NULL

Isso retorna todos os arquivos que não possuem nó associado. Não tenho certeza se é seguro excluir as linhas e arquivos retornados, provavelmente também depende da configuração do módulo. Use apenas por sua conta e risco!

Fonte: http://drupal.org/node/733258#comment-5582764

David Carter
fonte
5
Você poderia ter compartilhado o link para a postagem ORIGINAL em que você copiou sua postagem de ....... drupal.org/node/733258#comment-5582764 Eu acho que é antiético não mostrar a fonte.
Sk8erPeter
Seguindo o link que você postou acima, também acho que o código em drupal.org/node/733258#comment-7427898 é útil porque removerá os arquivos órfãos e suas entradas correspondentes no banco de dados.
Marcos Buarque
Na verdade, @ Sk8erPeter, é adequado resumir informações nas respostas e depois vincular a elas. Especialmente se eles vierem de uma fonte fora do Stack Exchange.
Christia
1
@Christia, se você leu o post original antes de editá-lo (coloquei o link na resposta), você pode ver que David copiou o comentário de outra pessoa palavra por palavra, sem sequer mencionar sua fonte e colocar um sinal de aspas ao redor da postagem. Isso pode ser considerado plágio, foi sobre isso que meu comentário foi. :)
Sk8erPeter
Você verá que isso produz alguns IDs de arquivo duplicados, para evitar isso e adicionar uma contagem das duplicatas pelas quais adicionei um grupo. SELECT fm. *, COUNT (*) FROM file_managed AS fm LEFT OUTER JOIN file_usage AS fu ON (fm.fid = fu.fid) LEFT OUTTER JOIN node AS n ON (fu.id = n.nid) WHERE fu.type = 'node' AND n.nid É NULL GROUP BY fm.fid;
Cameron
5

Para aqueles que chegam a este post três anos depois, há um pequeno módulo que você pode usar para fazer isso chamado Exclusão de arquivos extravagantes .

No momento desta postagem, ela está na versão beta; portanto, use-a por seu próprio risco. Como sempre, a limpeza de qualquer coisa órfã por meio de consultas ao banco de dados pode ser superficial e seu sucesso depende muito da configuração específica do módulo.

joe_flash
fonte
Achei esse módulo muito buggy - a ponto de ser inútil. ymmv.
Felix Eve
3

Algo que pode ajudar a identificar " arquivos que não estão mais anexados a nós ou arquivos e diretórios que não estão na tabela gerenciada por arquivos " (como na pergunta duplicada sobre " Como excluir arquivos não utilizados? "), É usar o comando Módulo Verificador de Arquivos . Alguns detalhes sobre isso, na página do projeto:

Em um mundo Drupal perfeito, o sistema de arquivos do servidor e as entradas correspodificadas na tabela de arquivos do Drupal são 100% sincronizadas. Mas e se partes do seu sistema de arquivos foram corrompidas devido a alguma falha no disco? Ou um dos seus módulos bagunçou seu banco de dados e arquivos? Ou seu script de implantação ficou obsoleto? Bem, este módulo o ajudará a monitorar e descobrir quais arquivos estão fora de sincronia.

Fora da caixa, a tabela de arquivos possui dois tipos de status: Temporário (0) e Permanente (1). O verificador de arquivos apresenta um status adicional Ausente (2). No escopo do processo de verificação, que pode ser acionado de várias maneiras, a coluna de status da tabela de arquivos é atualizada.

Recursos

  • Executar processo de verificação: sob demanda, via cron, via drush (no planejamento)
  • Página de visão geral da lista de arquivos com filtros
  • Integração de visualizações
  • Comando Drush para verificação de arquivos

Se você deseja exportar os resultados de uma visualização, é recomendável usar o módulo views_data_export.

Então, o que você poderia fazer é assim:

  • Clone (copie) seu site em algum ambiente de desenvolvimento, mas não copie nenhum arquivo no diretório que você deseja verificar. Como variação (se essa pergunta for sobre um site de status de não produção), apenas mova temporariamente todos os arquivos desse diretório.
  • Use o módulo Verificador de arquivos para descobrir quais arquivos estão "ausentes": esses são os arquivos que obviamente não são utilizados. Mas qualquer arquivo que este módulo não discuta é ... não utilizado!
  • Ao copiar todos os arquivos ausentes no local correto do diretório que você deseja verificar, recrie passo a passo um conteúdo perfeito do seu diretório.

Nota : embora esta pergunta seja sobre D7, também é uma versão (alfa) para D8.

Pierre.Vriens
fonte
Abordagem muito útil para resolver o meu problema
kb8
2

existe um módulo que remove arquivos indesejados arquivo fantasia excluir .

Visualização de todos os arquivos gerenciados com uma opção para forçá-los a excluí-los por meio de ações personalizadas do VBO Excluindo manualmente os arquivos gerenciados pelo FID (e uma opção para forçar a exclusão, se você realmente quiser). Excluindo arquivos não utilizados do diretório de arquivos padrão que não estão na tabela gerenciada por arquivos. AKA excluindo todos os arquivos não gerenciados. Excluindo arquivos não utilizados de toda a instalação que não estão mais anexados aos nós e à tabela de uso de arquivos. AKA excluindo todos os arquivos órfãos.

vgoradiya
fonte
1
Eu tenho uma experiência ruim com grandes operações maciças e módulo vbo. Inicialmente, usarei uma abordagem como sugerida por Pierre.Vriens, depois de usar seu módulo de sugestão para manter limpo o diretório de arquivos.
Kb8 26/05
0

Você pode excluir arquivos não utilizados

  1. Exclua manualmente da tabela file_managed , por alguma consulta como

    $this->database ->delete('file_managed') ->condition('fid', $fid, '=') ->execute();

  2. Definir o status de um arquivo 0 , para marcar, é um arquivo temporário; portanto, o cron o excluirá após um certo tempo.
    $file = File::load ($fid); $file->setTemporary();

Jasodeep Chatterjee
fonte
0

O módulo de exclusão de arquivos sofisticado não funcionou para mim. Aqui está uma alternativa mais manual.

Para excluir arquivos de uma pasta que não está na tabela de arquivos gerenciados, você pode:

1) Crie uma lista de todos os arquivos gerenciados:

mysql whateverdb -e "select filename from file_managed" > ~/managed-files.txt

2) Exclua todos os arquivos de um diretório que não está nessa lista. Para fazer isso, usei um pequeno script bash:

#!/bin/bash

IMG_FOLDER='/var/www/html/yoursite/docroot/sites/default/files/certain-images'
EXCLUDES='/home/yourhomeuser/managed-files.txt'

for FILE in $IMG_FOLDER/*; do
  if ! grep "$FILE" "$EXCLUDES"; then
        echo "Deleting $FILE"
        rm -f "$FILE"
  fi
done

Apenas altere a IMG_FOLDERvariável para o caminho de qualquer pasta da qual você deseja excluir arquivos (e atualize o caminho para o seu arquivo excluído)

Felix Eve
fonte