Come trovare file e immagini orfani che non sono collegati da alcun foglio di stile CSS o da alcun nodo?


21

C'è un modo per elencare tutti i file inutilizzati che risiedono all'interno del file system pubblico e all'interno di una directory dei temi ed elencarli, o forse hanno anche un'opzione per eliminarli automaticamente?

Intendo file che al momento non sono collegati da alcun foglio di stile CSS o da alcun nodo.


Vorrei sapere anche la risposta, grazie per aver pubblicato la domanda!
PNG

Ti riferisci ai file caricati con un campo (come ImageField) o ai file in generale (caricati tramite IMCE)? Non credo che sia possibile tenere traccia dei caricamenti IMCE senza cercare riferimenti nel corpo di ciascun nodo.
Chaulky,

Sì, sto caricando tramite IMCE. Speravo che ci fosse un modulo che fa quello che hai detto: scansiona i nodi per trovare i riferimenti alle immagini, quindi per i riferimenti interni drupal (senza dominio) scansiona le directory pertinenti e confronta entrambi per trovare i file inutilizzati. Forse qualcosa di simile viene fatto con i collegamenti in un modulo esistente per trovare collegamenti interrotti. Quindi ho pensato che forse esiste un modulo simile per le immagini ma forse non ..
Camcam

Risposte:


14

Puoi trovare file orfani eseguendo la seguente query 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

Ciò restituisce tutti i file che non hanno un nodo associato. Non sono sicuro che sia sicuro eliminare le righe e i file restituiti, probabilmente dipende anche dalla configurazione del modulo. Utilizzare solo a proprio rischio!

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


5
Avresti potuto condividere il link al post ORIGINALE da cui hai COPIATO il tuo post da ....... drupal.org/node/733258#comment-5582764 Penso che non sia etico non mostrare la fonte.
Sk8erPeter,

Seguendo il link che hai pubblicato sopra, penso anche che il codice in drupal.org/node/733258#comment-7427898 sia utile perché rimuoverà sia i file orfani che le loro voci corrispondenti nel database.
Marcos Buarque,

In realtà, @ Sk8erPeter, è corretto riassumere le informazioni nelle risposte e quindi collegarle ad esse. Soprattutto se provengono da una fonte esterna a Stack Exchange.
Christia,

1
@Christia, se leggi il post originale prima di modificarlo (ho inserito il link nella risposta), puoi vedere che David ha copiato il commento di qualcun altro parola per parola senza nemmeno menzionarne l'origine e mettere un segno di citazione attorno al post. Questo può essere considerato un plagio, questo è il mio commento. :)
Sk8erPeter

Scoprirai che questo produce alcuni ID file duplicati, per evitarlo e aggiungi un conteggio dei duplicati da cui ho aggiunto un gruppo. SELEZIONA fm. *, COUNT (*) DA file_managed AS fm LEFT OUTER JOIN file_usage AS fu ON (fm.fid = fu.fid) LEFT OUTER JOIN nodo AS n ON (fu.id = n.nid) DOVE fu.type = 'node' AND n.nid È NULL GROUP BY fm.fid;
Cameron,

5

Per chi arriva a questo post tre anni dopo, c'è un piccolo modulo che puoi usare per fare questo chiamato Fancy File Delete .

Al momento di questo post, è in beta, quindi usalo a tuo rischio. Come sempre, la pulizia di elementi orfani tramite query DB può essere imprecisa e il suo successo dipende in larga misura dalla configurazione del modulo.


Ho trovato questo modulo molto difettoso - al punto in cui era inutile. YMMV.
Felix Eve,

3

Qualcosa che può aiutare a identificare " file che non sono più associati a nodi o file e directory che non si trovano nella tabella gestita file " (come nella domanda duplicata su " Come eliminare i file non utilizzati? "), È usare il Modulo Controllo file . Alcuni dettagli a riguardo, dalla sua pagina del progetto:

In un mondo Drupal perfetto il tuo filesystem del server e le sue voci di correspoding nella tabella dei file di Drupal sono sincronizzati al 100%. Ma cosa succede se parti del file system sono state danneggiate a causa di un errore del disco? O uno dei tuoi moduli ha incasinato il tuo database e i tuoi file? O il tuo script deploy è diventato assurdo? Bene, allora questo modulo ti aiuterà a monitorare e scoprire quali file non sono sincronizzati.

La tabella dei file ha due tipi di stati predefiniti: Temporaneo (0) e Permanente (1). Il controllo file introduce uno stato aggiuntivo Mancante (2). Nell'ambito del processo di verifica che può essere attivato in vari modi viene aggiornata la colonna di stato della tabella dei file.

Caratteristiche

  • Esegui processo di verifica: su richiesta, tramite cron, via drush (in pianificazione)
  • Pagina di riepilogo dell'elenco dei file con filtri
  • Integrazione delle viste
  • Comando Drush per il controllo dei file

Se si desidera esportare i risultati di una vista, si consiglia di utilizzare il modulo views_data_export.

Quindi quello che potresti fare è così:

  • Clona (copia) il tuo sito in un ambiente di sviluppo, ma non copiare nessuno dei file nella directory che desideri controllare. Come variante (se questa domanda riguarda un sito con stato di non produzione), sposta temporaneamente tutti i file da quella directory.
  • Utilizza il modulo Controllo file per scoprire quali file "mancano": questi sono i file che ovviamente non sono inutilizzati. Ma qualsiasi file di cui questo modulo non discute è ... inutilizzato!
  • Copiando tutti i file mancanti nella posizione corretta della directory che si desidera controllare, si ricrea quindi passo dopo passo un contenuto perfetto della propria directory.

Nota : anche se questa domanda riguarda D7, è una versione (alfa) anche per D8.


Approccio molto utile per risolvere il mio problema
kb8,

2

c'è un modulo che rimuove i file indesiderati eliminazione dei file di fantasia .

Visualizzazione di tutti i file gestiti con un'opzione per forzare l'eliminazione tramite azioni personalizzate VBO Eliminazione manuale dei file gestiti tramite FID (e un'opzione per forzare l'eliminazione, se lo si desidera). Eliminazione di file non utilizzati dalla directory dei file predefiniti che non si trovano nella tabella gestita file. AKA eliminando tutti i file non gestiti. Eliminazione di file non utilizzati dall'intera installazione che non sono più associati ai nodi e alla tabella di utilizzo dei file. AKA eliminando tutti i file orfani.


1
Ho una brutta esperienza con grandi operazioni di massa e modulo vbo. Inizialmente userò un approccio come quello suggerito da Pierre.Vriens, dopo userò il tuo modulo di suggerimento per mantenere pulita la directory dei file.
kb8,

0

È possibile eliminare il file non utilizzato da

  1. Elimina manualmente dalla tabella file_managed , tramite una query come

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

  2. Impostando lo stato di un file 0 , per contrassegnare è come file temporaneo, quindi il cron lo cancellerà dopo un certo tempo.
    $file = File::load ($fid); $file->setTemporary();


0

Il modulo di eliminazione file di fantasia non ha funzionato affatto per me. Ecco un'alternativa più manuale.

Per eliminare file da una cartella che non si trova nella tabella dei file gestiti è possibile:

1) Crea un elenco di tutti i file gestiti:

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

2) Elimina tutti i file da una directory che non sono in quell'elenco. Per fare ciò ho usato un piccolo 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

Basta cambiare la IMG_FOLDERvariabile nel percorso della cartella da cui si desidera eliminare i file (e aggiornare il percorso nel file di esclusione)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.