Comment trouver des fichiers et des images orphelins qui ne sont pas liés à partir d'une feuille de style CSS ou d'un nœud?

21

Existe-t-il un moyen de répertorier tous les fichiers inutilisés qui résident dans le système de fichiers public et dans un répertoire de thèmes et de les répertorier, ou peut-être même de les supprimer automatiquement?

Je veux dire des fichiers qui ne sont actuellement liés à aucune feuille de style CSS ou à partir d'un nœud.

camcam
la source
J'aimerais aussi connaître la réponse à cela, merci d'avoir posté la question!
PNJ
Faites-vous référence à des fichiers téléchargés avec un champ (comme ImageField) ou à des fichiers en général (téléchargés via IMCE)? Je ne pense pas que vous puissiez suivre les téléchargements IMCE sans rechercher dans chaque corps de nœud des références.
Chaulky
Oui, je télécharge via IMCE. J'espérais qu'il y ait un module qui fait ce que vous avez dit: analyser les nœuds pour trouver les références d'image, puis pour les références internes de Drupal (sans domaine) analyser les répertoires pertinents et comparer les deux pour trouver les fichiers inutilisés. Peut-être que quelque chose de similaire est fait avec des liens dans un module existant pour trouver des liens rompus. J'ai donc pensé que peut-être un module similaire existe pour les images mais peut-être pas ..
camcam

Réponses:

14

Vous pouvez rechercher des fichiers orphelins en exécutant la requête MySQL suivante:

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

Cela renvoie tous les fichiers qui n'ont aucun nœud associé. Je ne sais pas s'il est sûr de supprimer les lignes et les fichiers retournés, cela dépend probablement aussi de la configuration de votre module. Utilisez uniquement à vos risques et périls!

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

David Carter
la source
5
Vous auriez pu partager le lien vers le message ORIGINAL que vous avez COPIÉ votre message depuis ....... drupal.org/node/733258#comment-5582764 Je pense qu'il est très contraire à l'éthique de ne pas montrer la source.
Sk8erPeter
En suivant le lien que vous avez publié ci-dessus, je pense également que le code dans drupal.org/node/733258#comment-7427898 est utile car il supprimera à la fois les fichiers orphelins et leurs entrées correspondantes dans la base de données.
Marcos Buarque
En fait, @ Sk8erPeter, il convient de résumer les informations dans les réponses, puis de les lier à celles-ci. Surtout s'ils proviennent d'une source extérieure à Stack Exchange.
Christia
1
@Christia, si vous avez lu le message d'origine avant de le modifier (j'ai mis le lien dans la réponse), vous pouvez voir que David a copié le commentaire de quelqu'un d'autre mot par mot sans même mentionner sa source et mettre un signe de citation autour du message. Cela peut être considéré comme du plagiat, c'est ce dont parlait mon commentaire. :)
Sk8erPeter
Vous constaterez que cela produit des identifiants de fichiers en double, pour éviter cela et ajouter un nombre de doublons par lesquels j'ai ajouté un groupe. SELECT fm. *, COUNT (*) 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) OERE fu.type = 'node' ET n.nid EST NULL GROUP BY fm.fid;
Cameron
5

Pour ceux qui viendront à ce poste trois ans plus tard, il y a un petit module que vous pouvez utiliser pour le faire appelé Fancy File Delete .

Au moment de ce post, il est en version bêta, alors utilisez-le à vos risques et périls. Comme toujours, le nettoyage de tout objet orphelin via des requêtes DB peut être sommaire et son succès dépend fortement de la configuration particulière de votre module.

joe_flash
la source
J'ai trouvé ce module très buggé - au point où il était inutile. ymmv.
Felix Eve
3

Quelque chose qui peut aider à identifier "les fichiers qui ne sont plus attachés aux nœuds ou aux fichiers et répertoires qui ne sont pas dans la table gérée par les fichiers " (comme dans la question en double sur " Comment faire pour supprimer les fichiers inutilisés? "), Est d'utiliser le Module Vérificateur de fichiers . Quelques détails à ce sujet, depuis sa page de projet:

Dans un monde Drupal parfait, le système de fichiers de votre serveur et ses entrées de correspondance dans la table des fichiers de Drupal sont 100% synchronisés. Mais que se passe-t-il si des parties de votre système de fichiers ont été corrompues en raison d'une défaillance du disque? Ou l'un de vos modules a gâché votre base de données et vos fichiers? Ou votre script de déploiement est devenu fou? Eh bien, ce module vous aidera à surveiller et à découvrir quels fichiers ne sont pas synchronisés.

Hors de la boîte, la table des fichiers a deux types de statuts: Temporaire (0) et Permanent (1). Le vérificateur de fichiers introduit un statut supplémentaire manquant (2). Dans le cadre du processus de vérification qui peut être déclenché de différentes manières, la colonne d'état de la table des fichiers est mise à jour.

traits

  • Exécuter le processus de vérification: à la demande, via cron, via drush (en planification)
  • Page de présentation de la liste des fichiers avec filtres
  • Intégration des vues
  • Commande Drush pour la vérification des fichiers

Si vous souhaitez exporter les résultats d'une vue, il est recommandé d'utiliser le module views_data_export.

Donc, ce que vous pourriez faire, c'est comme ça:

  • Clonez (copiez) votre site dans un environnement de développement, mais ne copiez aucun des fichiers du répertoire que vous souhaitez vérifier. En variante (si cette question concerne un site de statut hors production), déplacez temporairement tous les fichiers hors de ce répertoire.
  • Utilisez le module File Checker pour savoir quels fichiers sont "manquants": ce sont des fichiers qui ne sont évidemment pas inutilisés. Mais tout fichier sur lequel ce module ne discute pas est ... inutilisé!
  • En copiant tous les fichiers manquants à l'emplacement correct du répertoire que vous souhaitez vérifier, vous recréez ensuite étape par étape un contenu parfait de votre répertoire.

Remarque : même si cette question concerne D7, il en existe une version (alfa) également pour D8.

Pierre.Vriens
la source
Approche très utile pour résoudre mon problème
kb8
2

il y a un module qui supprime les fichiers indésirables fichier de fantaisie supprimer .

Vue de tous les fichiers gérés avec une option pour forcer leur suppression via des actions personnalisées VBO Suppression manuelle des fichiers gérés par FID (et une option pour forcer la suppression si vous le souhaitez vraiment). Suppression des fichiers inutilisés du répertoire des fichiers par défaut qui ne se trouvent pas dans la table gérée par les fichiers. AKA supprimant tous les fichiers non gérés. Suppression des fichiers inutilisés de l'installation complète qui ne sont plus attachés aux nœuds et à la table d'utilisation des fichiers. AKA supprimant tous les fichiers orphelins.

vgoradiya
la source
1
J'ai une mauvaise expérience avec de grandes opérations massives et un module vbo. Au départ j'utiliserai une approche comme suggérée par Pierre.Vriens, après j'utiliserai votre module de suggestion pour maintenir propre le répertoire des fichiers.
kb8
0

Vous pouvez supprimer le fichier inutilisé en

  1. Supprimer manuellement de la table file_managed , par une requête comme

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

  2. La définition de l'état d'un fichier 0 , pour marquer est comme un fichier temporaire, donc le cron le supprimera après un certain temps.
    $file = File::load ($fid); $file->setTemporary();

Jasodeep Chatterjee
la source
0

Le module de suppression de fichiers fantaisie ne fonctionnait pas du tout pour moi. Voici une alternative plus manuelle.

Pour supprimer des fichiers d'un dossier qui ne figurent pas dans la table des fichiers gérés, vous pouvez:

1) Créez une liste de tous les fichiers gérés:

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

2) Supprimez tous les fichiers d'un répertoire qui ne figurent pas dans cette liste. Pour ce faire, j'ai utilisé un petit 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

Changez simplement la IMG_FOLDERvariable en chemin du dossier dans lequel vous voulez supprimer les fichiers (et mettez à jour le chemin vers votre fichier exclut)

Felix Eve
la source