Jak znaleźć osierocone pliki i obrazy, które nie są połączone z żadnym arkuszem stylów css ani z żadnego węzła?

21

Czy istnieje sposób na wyświetlenie listy wszystkich nieużywanych plików znajdujących się w publicznym systemie plików oraz w katalogu motywów i ich listę, a może nawet opcję ich automatycznego usunięcia?

Mam na myśli pliki, które nie są obecnie połączone z żadnym arkuszem stylów css ani z żadnego węzła.

kamera
źródło
Chciałbym również poznać odpowiedź na to pytanie, dziękuję za opublikowanie pytania!
NPC
Czy masz na myśli pliki przesłane z polem (jak ImageField) lub ogólnie pliki (przesłane przez IMCE)? Nie sądzę, że można śledzić przesyłanie IMCE bez przeszukiwania każdego węzła w poszukiwaniu odniesień.
Chaulky
Tak, przesyłam przez IMCE. Miałem nadzieję, że istnieje moduł, który robi to, co powiedziałeś: skanuj węzły w celu znalezienia odniesień do obrazów, a następnie w poszukiwaniu wewnętrznych odniesień do drupala (bez domeny) skanuj odpowiednie katalogi i porównaj oba, aby znaleźć nieużywane pliki. Być może coś podobnego robi się z linkami w istniejącym module, aby znaleźć zepsute linki. Pomyślałem więc, że może istnieje podobny moduł do zdjęć, ale może nie ...
kamera z

Odpowiedzi:

14

Możesz znaleźć osierocone pliki, uruchamiając następujące zapytanie 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

Zwraca wszystkie pliki, które nie mają powiązanego węzła. Nie jestem pewien, czy bezpiecznie jest usunąć zwrócone wiersze i pliki, prawdopodobnie zależy to również od konfiguracji modułu. Używaj tylko na własne ryzyko!

Źródło: http://drupal.org/node/733258#comment-5582764

David Carter
źródło
5
Mógłeś udostępnić link do ORYGINALNEGO posta, który skopiowałeś swój post z ....... drupal.org/node/733258#comment-5582764 Myślę, że nieetyczne jest nie pokazywanie źródła.
Sk8erPeter
Podążając za linkiem, który zamieściłeś powyżej, myślę również, że kod w drupal.org/node/733258#comment-7427898 jest przydatny, ponieważ usunie zarówno osierocone pliki, jak i odpowiadające im wpisy w bazie danych.
Marcos Buarque
W rzeczywistości, @ Sk8erPeter, właściwe jest podsumowanie informacji w odpowiedziach, a następnie link do nich. Zwłaszcza jeśli pochodzą ze źródła spoza Stack Exchange.
Christia
1
@Christia, jeśli czytasz oryginalny post przed jego edycją (umieszczam link w odpowiedzi), możesz zobaczyć, że David skopiował komentarz innego słowa słowo po słowie, nawet nie wspominając o jego źródle i umieszczając znak cudzysłowu wokół postu. Można to uznać za plagiat, o tym właśnie był mój komentarz. :)
Sk8erPeter
Przekonasz się, że tworzy to kilka duplikatów identyfikatorów plików, aby tego uniknąć i dodać liczbę duplikatów, według których dodałem grupę. WYBIERZ fm. *, LICZBA (*) Z zarządzanego_pliku AS fm POŁĄCZENIE Z LEWEJ ZEWNĘTRZNEJ użycie pliku AS fu WŁ. (Fm.fid = fu.fid) Węzeł ZEWNĘTRZNEJ ŁĄCZENIA AS n WŁĄCZONY (fu.id = n.nid) GDZIE fu.type = „node” AND n.nid IS NULL GROUP BY fm.fid;
Cameron
5

Dla tych, którzy przyjdą do tego postu trzy lata później, możesz użyć małego modułu o nazwie Fancy File Delete .

W momencie pisania tego posta jest on w fazie beta, więc używaj go na własne ryzyko. Jak zawsze, usuwanie osieroconych elementów za pomocą zapytań DB może być szkicowe, a jego sukces zależy w dużej mierze od konfiguracji konkretnego modułu.

joe_flash
źródło
Uważam, że ten moduł jest bardzo wadliwy - do tego stopnia, że ​​był bezużyteczny. ymmv.
Felix Eve
3

Coś, co może pomóc w identyfikacji „ plików, które nie są już dołączone do węzłów lub plików i katalogów, które nie znajdują się w tabeli zarządzanej plikami ” (jak w zduplikowanym pytaniu na temat „ Jak usunąć nieużywane pliki? ”), Polega na użyciu Moduł sprawdzania plików . Kilka szczegółów na ten temat na stronie projektu:

W idealnym świecie Drupala system plików serwera i odpowiadające mu wpisy w tabeli plików Drupala są w 100% zsynchronizowane. Ale co, jeśli niektóre części systemu plików zostały uszkodzone z powodu awarii dysku? A może jeden z modułów pomieszał bazę danych i pliki? Czy twój skrypt wdrażania poszedł na gorsze? Cóż, ten moduł pomoże ci monitorować i dowiedzieć się, które pliki nie są zsynchronizowane.

Po wyjęciu z pudełka tabela plików ma dwa rodzaje statusów: tymczasowy (0) i stały (1). Kontroler plików wprowadza dodatkowy status Missing (2). W ramach procesu weryfikacji, który można uruchomić na różne sposoby, kolumna statusu tabeli plików jest aktualizowana.

cechy

  • Uruchom proces weryfikacji: na żądanie, przez crona, przez drush (w planowaniu)
  • Strona przeglądu listy plików z filtrami
  • Integracja widoków
  • Komenda Drush do sprawdzania plików

Jeśli chcesz wyeksportować wyniki widoku, zalecane jest użycie modułu views_data_export.

Więc możesz to zrobić tak:

  • Sklonuj (skopiuj) swoją witrynę do jakiegoś środowiska programistycznego, ale nie kopiuj żadnych plików w katalogu, który chcesz sprawdzić. Jako wariant (jeśli to pytanie dotyczy witryny o statusie nieprodukcyjnym), po prostu tymczasowo przenieś wszystkie pliki z tego katalogu.
  • Użyj modułu File Checker , aby dowiedzieć się, które pliki są „brakujące”: są to pliki, które oczywiście nie są nieużywane. Ale każdy plik, o który ten moduł nie dyskutuje, jest ... nieużywany!
  • Kopiując wszystkie brakujące pliki do właściwej lokalizacji katalogu, który chcesz sprawdzić, a następnie krok po kroku odtwarzaj idealną zawartość katalogu.

Uwaga : nawet jeśli to pytanie dotyczy D7, jest to wersja (alfa) również dla D8.

Pierre.Vriens
źródło
Bardzo pomocne podejście do rozwiązania mojego problemu
kb8
2

jest jeden moduł, który usuwa niechciane pliki fantazyjne usuwanie plików .

Widok wszystkich zarządzanych plików z opcją wymuszenia ich usunięcia za pomocą niestandardowych akcji VBO Ręczne usuwanie zarządzanych plików przez FID (oraz opcja wymuszenia usunięcia, jeśli naprawdę chcesz). Usuwanie nieużywanych plików z domyślnego katalogu plików, których nie ma w tabeli zarządzanej plikami. AKA usuwanie wszystkich niezarządzanych plików. Usuwanie nieużywanych plików z całej instalacji, które nie są już dołączone do węzłów i tabeli wykorzystania plików. AKA usuwanie wszystkich osieroconych plików.

Vgoradiya
źródło
1
Mam złe doświadczenia z dużymi, masywnymi operacjami i modułem vbo. Początkowo zastosuję podejście sugerowane przez Pierre.Vriens, po czym użyję modułu sugestii do utrzymania czystości katalogu plików.
kb8
0

Możesz usunąć nieużywany plik przez

  1. Usuń ręcznie z tabeli file_managed , przy pomocy jakiegoś zapytania

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

  2. Ustawienie statusu pliku 0 , aby oznaczyć jako plik tymczasowy, więc cron usunie go po pewnym czasie.
    $file = File::load ($fid); $file->setTemporary();

Jasodeep Chatterjee
źródło
0

The wymyślnego usuwania plików w ogóle dla mnie nie działał. Oto bardziej ręczna alternatywa.

Aby usunąć pliki z folderu, którego nie ma w zarządzanej tabeli plików, możesz:

1) Utwórz listę wszystkich zarządzanych plików:

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

2) Usuń wszystkie pliki z katalogu, którego nie ma na tej liście. Aby to zrobić, użyłem małego skryptu 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

Po prostu zmień IMG_FOLDERzmienną na ścieżkę dowolnego folderu, z którego chcesz usunąć pliki (i zaktualizuj ścieżkę do pliku wykluczeń)

Felix Eve
źródło