Wie finde ich verwaiste Dateien und Bilder, die nicht mit einem CSS-Stylesheet oder einem Knoten verknüpft sind?

21

Gibt es eine Möglichkeit, alle nicht verwendeten Dateien aufzulisten, die sich im öffentlichen Dateisystem und in einem Themenverzeichnis befinden, und sie aufzulisten, oder sogar die Option, sie automatisch zu löschen?

Ich meine Dateien, die derzeit nicht von einem CSS-Stylesheet oder einem Knoten verlinkt sind.

camcam
quelle
Ich möchte auch die Antwort darauf wissen, danke, dass Sie die Frage gestellt haben!
NPC
Beziehen Sie sich auf Dateien, die mit einem Feld hochgeladen wurden (wie ImageField), oder auf Dateien im Allgemeinen (hochgeladen über IMCE)? Ich glaube nicht, dass Sie IMCE-Uploads verfolgen können, ohne jeden Knotenkörper nach Referenzen zu durchsuchen.
Chaulky
Ja, ich lade über IMCE hoch. Ich hatte gehofft, dass es ein Modul gibt, das genau das tut, was Sie gesagt haben: Knoten scannen, um Bildreferenzen zu finden, dann nach internen Drupal-Referenzen (ohne Domäne) relevante Verzeichnisse scannen und beide vergleichen, um nicht verwendete Dateien zu finden. Möglicherweise wird etwas Ähnliches mit Links in einem vorhandenen Modul gemacht, um defekte Links zu finden. Also dachte ich, vielleicht gibt es ein ähnliches Modul für Bilder, aber vielleicht auch nicht ..
camcam

Antworten:

14

Sie können verwaiste Dateien finden, indem Sie die folgende MySQL-Abfrage ausführen:

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

Dies gibt alle Dateien zurück, denen kein Knoten zugeordnet ist. Ich bin nicht sicher, ob es sicher ist, die zurückgegebenen Zeilen und Dateien zu löschen. Dies hängt wahrscheinlich auch von Ihrer Modulkonfiguration ab. Benutzung nur auf eigenes Risiko!

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

David Carter
quelle
5
Sie hätten den Link zu dem ORIGINAL-Beitrag teilen können, von dem Sie Ihren Beitrag kopiert haben ....... drupal.org/node/733258#comment-5582764 Ich halte es für sehr unethisch, die Quelle nicht zu zeigen.
Sk8erPeter
Nach dem Link, den Sie oben gepostet haben, halte ich auch den Code in drupal.org/node/733258#comment-7427898 für nützlich, da er sowohl die verwaisten Dateien als auch die entsprechenden Einträge in der Datenbank entfernt.
Marcos Buarque
Eigentlich ist es bei Sk8erPeter angebracht, die Informationen in den Antworten zusammenzufassen und sie dann zu verknüpfen. Insbesondere, wenn sie von einer Quelle außerhalb von Stack Exchange stammen.
Christia
1
@Christia, wenn du den Originalbeitrag gelesen hast, bevor ich ihn bearbeitet habe (ich habe den Link in die Antwort eingefügt), kannst du sehen, dass David den Kommentar eines anderen Wort für Wort kopiert hat, ohne auch nur die Quelle zu erwähnen und den Beitrag mit einem Anführungszeichen zu versehen. Dies kann als Plagiat angesehen werden, darum ging es in meinem Kommentar. :)
Sk8erPeter
Sie werden feststellen, dass dies zu doppelten Datei-IDs führt, um dies zu vermeiden, und die Anzahl der Duplikate addieren, nach denen ich eine Gruppe hinzugefügt habe. SELECT fm. *, COUNT (*) FROM dateiverwaltet AS fm LEFT OUTER JOIN dateiverwendung AS fu ON (fm.fid = fu.fid) Knoten LEFT OUTER JOIN AS n ON (fu.id = n.nid) WHERE fu.type = 'node' AND n.nid IST NULL GROUP BY fm.fid;
Cameron
5

Für diejenigen, die drei Jahre später zu diesem Beitrag kommen, gibt es ein kleines Modul, das Sie dazu verwenden können: Fancy File Delete .

Zum Zeitpunkt dieses Beitrags befindet es sich in der Betaphase. Verwenden Sie ihn daher auf eigenes Risiko. Wie immer kann die Bereinigung von verwaisten Objekten durch DB-Abfragen lückenhaft sein, und der Erfolg hängt stark von der jeweiligen Modulkonfiguration ab.

joe_flash
quelle
Ich fand dieses Modul sehr fehlerhaft - bis zu dem Punkt, an dem es nutzlos war. ymmv.
Felix Eve
3

Etwas, das bei der Identifizierung von " Dateien, die nicht mehr an Knoten oder Dateien und Verzeichnisse angehängt sind, die nicht in der dateiverwalteten Tabelle enthalten sind " (wie in der doppelten Frage zu " Löschen nicht verwendeter Dateien ") hilfreich sein kann , ist die Verwendung von Datei-Checker- Modul. Einige Details dazu auf der Projektseite:

In einer perfekten Drupal-Welt sind Ihr Server-Dateisystem und die entsprechenden Einträge in der Drupal-Dateitabelle zu 100% synchronisiert. Aber was ist, wenn Teile Ihres Dateisystems aufgrund eines Festplattenfehlers beschädigt wurden? Oder eines Ihrer Module hat Ihre Datenbank und Ihre Dateien durcheinander gebracht? Oder Ihr Bereitstellungsskript ist verrückt geworden? Dann hilft Ihnen dieses Modul, zu überwachen und festzustellen, welche Dateien nicht synchron sind.

Die Dateitabelle hat standardmäßig zwei Arten von Status: Temporär (0) und Permanent (1). Die Dateiprüfung führt einen zusätzlichen Status Fehlend (2) ein. Im Rahmen des Überprüfungsprozesses, der auf verschiedene Arten ausgelöst werden kann, wird die Statusspalte der Dateitabelle aktualisiert.

Eigenschaften

  • Verifizierungsprozess ausführen: auf Anfrage, per Cron, per Drush (in Planung)
  • Dateilisten-Übersichtsseite mit Filtern
  • Sichtet die Integration
  • Drush-Befehl zur Dateiprüfung

Wenn Sie die Ergebnisse einer Ansicht exportieren möchten, wird empfohlen, das Modul views_data_export zu verwenden.

Was Sie also tun könnten, ist wie folgt:

  • Klonen (kopieren) Sie Ihre Site in eine Entwicklerumgebung, kopieren Sie jedoch keine Dateien in das Verzeichnis, das Sie überprüfen möchten. Verschieben Sie als Variation (wenn es sich bei dieser Frage um eine Nichtproduktionsstatuswebsite handelt) nur vorübergehend alle Dateien aus diesem Verzeichnis.
  • Verwenden Sie das File Checker- Modul, um herauszufinden, welche Dateien "fehlen": Dies sind die Dateien, die offensichtlich nicht unbenutzt sind. Aber jede Datei, über die dieses Modul nicht diskutiert, ist ... unbenutzt!
  • Indem Sie alle fehlenden Dateien an den richtigen Speicherort des zu überprüfenden Verzeichnisses kopieren, erstellen Sie Schritt für Schritt einen perfekten Inhalt Ihres Verzeichnisses.

Hinweis : Obwohl es sich bei dieser Frage um D7 handelt, handelt es sich um eine (Alfa-) Version davon, auch für D8.

Pierre.Vriens
quelle
Sehr hilfreicher Ansatz zur Lösung meines Problems
kb8
2

Es gibt ein Modul, das unerwünschte Dateien entfernt, um Dateien zu löschen .

Anzeigen aller verwalteten Dateien mit der Option, das Löschen über benutzerdefinierte VBO-Aktionen zu erzwingen. Manuelles Löschen verwalteter Dateien über FID (und die Option, das Löschen zu erzwingen, wenn Sie dies wirklich möchten). Löschen nicht verwendeter Dateien aus dem Standarddateiverzeichnis, die nicht in der dateiverwalteten Tabelle enthalten sind. AKA löscht alle nicht verwalteten Dateien. Löschen nicht verwendeter Dateien aus der gesamten Installation, die nicht mehr an Knoten und die Dateiverwendungstabelle angehängt sind. AKA löscht alle verwaisten Dateien.

vgoradiya
quelle
1
Ich habe eine schlechte Erfahrung mit großen massiven Operationen und VBO-Modul. Zunächst werde ich einen Ansatz verwenden, wie er von Pierre.Vriens vorgeschlagen wurde, nachdem ich Ihr Vorschlagsmodul verwendet habe, um das Dateiverzeichnis sauber zu halten.
kb8
0

Sie können nicht verwendete Dateien mit löschen

  1. Löschen Sie manuell aus der Tabelle file_managed , indem Sie eine Abfrage wie

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

  2. Wenn Sie den Status einer Datei auf 0 setzen , wird sie als temporäre Datei markiert, sodass der Cron sie nach einer bestimmten Zeit löscht.
    $file = File::load ($fid); $file->setTemporary();

Jasodeep Chatterjee
quelle
0

Das ausgefallene Modul zum Löschen von Dateien hat bei mir überhaupt nicht funktioniert. Hier ist eine manuellere Alternative.

So löschen Sie Dateien aus einem Ordner, der nicht in der Tabelle der verwalteten Dateien enthalten ist:

1) Erstellen Sie eine Liste aller verwalteten Dateien:

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

2) Löschen Sie alle Dateien aus einem Verzeichnis, das nicht in dieser Liste enthalten ist. Dazu habe ich ein kleines Bash-Skript verwendet:

#!/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

Ändern IMG_FOLDERSie einfach die Variable in den Pfad des Ordners, aus dem Sie Dateien löschen möchten (und aktualisieren Sie den Pfad zu Ihrer Ausschlussdatei).

Felix Eve
quelle