Як знайти осиротілі файли та зображення, які не пов'язані ні з таблицями стилів css, ні з будь-якого вузла?


21

Чи є спосіб перерахувати всі невикористані файли, які знаходяться всередині загальнодоступної файлової системи та всередині тематичного каталогу, та перелічити їх, а може, навіть є можливість автоматично видалити їх?

Я маю на увазі файли, які в даний час не пов'язані ні з таблицею стилів css, ні з будь-якого вузла.


Я також хотів би знати відповідь на це, дякую за повідомлення!
NPC

Ви маєте на увазі файли, завантажені з поля (наприклад, ImageField) або файли взагалі (завантажені через IMCE)? Я не думаю, що ви можете відстежувати завантаження IMCE, не шукаючи посилання на кожен вузол.
Chaulky

Так, я завантажую через IMCE. Я сподівався, що існує модуль, який виконує те, що ви сказали: скануйте вузли, щоб знайти посилання на зображення, а потім на внутрішні посилання друпалу (без домену) скануйте відповідні каталоги та порівняйте обидва, щоб знайти невикористані файли. Можливо, щось подібне робиться із посиланнями в існуючому модулі для пошуку зламаних посилань. Тому я подумав, що, можливо, подібний модуль існує для зображень, але, можливо, немає ..
camcam

Відповіді:


14

Ви можете знайти осиротілі файли, запустивши наступний запит 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

Це повертає всі файли, які не мають асоційованого вузла. Я не впевнений, чи безпечно видаляти повернуті рядки та файли, ймовірно, це також залежить від налаштування модуля. Використовуйте лише на свій страх і ризик!

Джерело: http://drupal.org/node/733258#comment-5582764


5
Ви могли поділитися посиланням на ОРИГІНАЛЬНУ допис, яким ви КОПІЄТЬ свою публікацію від ....... drupal.org/node/733258#comment-5582764 Я думаю, що неетично не показувати джерело.
Sk8erPeter

За посиланням, яке ви опублікували вище, я також вважаю, що код в drupal.org/node/733258#comment-7427898 є корисним, оскільки він видалить і осиротілі файли, і їх відповідні записи в базі даних.
Маркос Буарке

Насправді, @ Sk8erPeter, це правильне підбивати інформацію у відповідях, а потім посилатися на неї. Особливо, якщо вони надходять з джерела за межами Stack Exchange.
Крістен

1
@Christia, якщо ви прочитали оригінальний пост до того, як я його відредагував (я поклав посилання у відповідь), ви зможете побачити, що Девід скопіював чуже коментар слово за словом, навіть не згадуючи його джерела і не поставивши знак цитати навколо публікації. Це можна розцінювати як плагіат, саме про це мій коментар. :)
Sk8erPeter

Ви побачите, що це створює деякі дублікати ідентифікаторів файлів, щоб уникнути цього та додати кількість дублікатів, до яких я додала групу. ВИБІР fm. *, COUNT (*) ВІД файлу_управління AS fm ЛІВНІЙ ВІДПОЛУЧАЙТЕ file_usage AS fu ON (fm.fid = fu.fid) ЛІВНІЙ ВИХІД ПРИЄДНАЙТЕ вузол AS n ON (fu.id = n.nid) WHERE fu.type = 'вузол' І n.nid НУЛЬНА ГРУПА ПО fm.fid;
Камерон

5

Для тих, хто прийшов на цю посаду через три роки, є невеликий модуль, який ви можете використовувати для цього під назвою Видалити фантазійні файли .

На час цієї публікації вона знаходиться в бета-версії, тому використовуйте її на свій страх і ризик. Як завжди, очищення осиротілих за допомогою запитів БД може бути схематичним, і його успіх сильно залежить від налаштування конкретного модуля.


Я вважав цей модуль дуже глючним - до того, коли він був марним. ymmv.
Фелікс Єва

3

Щось, що може допомогти визначити " файли, які більше не прикріплені до вузлів або файлів та каталогів, які не знаходяться в таблиці керованих файлами " (як у повторюваному запитанні " Як видалити невикористані файли? "), - це використовувати Модуль перевірки файлів . Деякі деталі про нього, зі сторінки його проекту:

У ідеальному світі Drupal ваша файлова система сервера та його відповідні записи в таблиці файлів Drupal синхронізуються на 100%. Але що робити, якщо частини вашої файлової системи були пошкоджені через деякий збій диска? Або один із ваших модулів зіпсував вашу базу даних та файли? Або ваш сценарій розгортання пішов з позиції? Ну, тоді цей модуль допоможе вам відстежувати та з’ясовувати, які файли не синхронізовані.

У таблиці файлів є два типи статусів: Тимчасовий (0) та Постійний (1). Засіб перевірки файлів вводить додатковий статус відсутній (2). У межах процесу перевірки, який може бути викликаний різними способами, стовпець статусу таблиці файлів оновлюється.

Особливості

  • Запустити процес перевірки: на вимогу, через cron, через ударну (в плануванні)
  • Сторінка огляду списку файлів з фільтрами
  • Інтеграція поглядів
  • Команда Drush для перевірки файлів

Якщо потрібно експортувати результати перегляду, рекомендується використовувати модуль views_data_export.

Тож, що ви могли зробити, це так:

  • Клонуйте (скопіюйте) свій сайт у якесь середовище розробника, але не копіюйте жодного з файлів у каталозі, який ви хочете перевірити. Як варіант (якщо це питання стосується статусу не виробничого статусу), просто тимчасово перемістіть усі файли з цього каталогу.
  • Використовуйте модуль перевірки файлів, щоб дізнатися, які файли "відсутні": це файли, які явно не використовуються. Але будь-який файл, про який цей модуль не сперечається, є ... невикористаним!
  • Копіюючи всі відсутні файли в правильне розташування каталогу, який ви хочете перевірити, ви потім крок за кроком відтворюєте ідеальний вміст вашого каталогу.

Примітка . Хоча це питання стосується D7, це (альфа) його версія також для D8.


Дуже корисний підхід для вирішення мого питання
kb8

2

є один модуль, який видаляє непотрібні файли фантазійного видалення файлів .

Перегляд усіх керованих файлів з можливістю примусового видалення їх за допомогою спеціальних дій VBO Вручне видалення керованих файлів за допомогою FID (та опція примусового видалення, якщо ви дійсно бажаєте). Видалення невикористаних файлів із каталогу файлів за замовчуванням, які не знаходяться в таблиці керованих файлів. AKA видаляє всі керовані файли. Видалення невикористаних файлів з усієї установки, які більше не прикріплені до вузлів та таблиці використання файлів. AKA видаляє всі осиротілі файли.


1
У мене поганий досвід великих масштабних операцій та модуля vbo. Спочатку я буду використовувати такий підхід, як запропонував Pierre.Vriens, після того, як я буду використовувати ваш модуль пропозиції для підтримки чистого каталогу файлів.
kb8

0

Ви можете видалити невикористаний файл

  1. Видаліть вручну з таблиці file_managed , за допомогою деяких запитів

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

  2. Встановлення статусу файлу 0 для позначення є тимчасовим файлом, тому cron буде видалений через певний час.
    $file = File::load ($fid); $file->setTemporary();


0

The Видалення фантазії файл модуль не працює взагалі для мене. Ось більш ручна альтернатива.

Щоб видалити файли з папки, яка не знаходиться в керованій таблиці файлів, ви можете:

1) Створіть список усіх керованих файлів:

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

2) Видаліть усі файли з каталогу, які відсутні в цьому списку. Для цього я використав невеликий скрипт 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

Просто змініть IMG_FOLDERзмінну на шлях до будь-якої папки, з якої потрібно видалити файли (та оновіть шлях до виключеного файлу)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.