Как найти потерянные файлы и изображения, которые не связаны ни с одной таблицей стилей CSS или с какого-либо узла?

21

Есть ли способ перечислить все неиспользуемые файлы, которые находятся в общедоступной файловой системе и в каталоге темы, и перечислить их, или, возможно, даже есть возможность удалить их автоматически?

Я имею в виду файлы, которые в настоящее время не связаны ни с одной таблицей стилей CSS, ни с какого-либо узла.

CamCam
источник
Я тоже хотел бы знать ответ на этот вопрос, спасибо за вопрос!
NPC
Вы имеете в виду файлы, загруженные с помощью поля (например, ImageField) или файлы в целом (загруженные через IMCE)? Я не думаю, что вы можете отслеживать загрузки IMCE без поиска ссылок на каждое тело узла.
Чолки
Да, я загружаю через IMCE. Я надеялся, что есть модуль, который выполняет то, что вы сказали: сканируйте узлы, чтобы найти ссылки на изображения, затем для внутренних ссылок drupal (без домена) сканируйте соответствующие каталоги и сравнивайте оба, чтобы найти неиспользуемые файлы. Возможно, что-то подобное делается со ссылками в существующем модуле для поиска неработающих ссылок. Поэтому я подумал, что, возможно, аналогичный модуль существует для изображений, а может и нет ..
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 (*) ИЗ file_managed AS fm ЛЕВОЕ ВНЕШНЕЕ ПОДКЛЮЧЕНИЕ 'node' AND n.nid - это NULL GROUP BY fm.fid;
Кэмерон
5

Для тех, кто придет на этот пост три года спустя, есть небольшой модуль, который вы можете использовать для этого, который называется Fancy File Delete .

На момент написания этой статьи он был в бета-версии, поэтому используйте его на свой страх и риск. Как всегда, очистка потерянных объектов с помощью запросов к БД может быть отрывочной, и ее успех сильно зависит от настроек вашего конкретного модуля.

joe_flash
источник
Я нашел этот модуль очень глючным - до такой степени, что он был бесполезен. YMMV.
Феликс Ив
3

Что-то, что может помочь идентифицировать « файлы, которые больше не прикреплены к узлам или файлам и каталогам, которых нет в таблице управления файлами » (как в дублирующем вопросе « Как удалить неиспользуемые файлы? »), Это использовать Модуль проверки файлов . Некоторые подробности об этом на странице проекта:

В идеальном мире Drupal ваша серверная файловая система и соответствующие ей записи в таблице файлов Drupal синхронизированы на 100%. Но что, если части вашей файловой системы были повреждены из-за сбоя диска? Или один из ваших модулей испортил вашу базу данных и файлы? Или ваш сценарий развертывания пошёл дальше? Что ж, тогда этот модуль поможет вам отслеживать и выяснять, какие файлы не синхронизированы.

Из коробки файловая таблица имеет два вида статусов: Временный (0) и Постоянный (1). Проверка файлов вводит дополнительный статус Missing (2). В рамках процесса проверки, который может запускаться различными способами, обновляется столбец состояния таблицы файлов.

Характеристики

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

Если вы хотите экспортировать результаты представления, рекомендуется использовать модуль views_data_export.

Так что вы могли бы сделать так:

  • Клонируйте (скопируйте) свой сайт в какую-либо среду разработки, но не копируйте файлы в каталог, который вы хотите проверить. Как вариант (если этот вопрос касается сайта непроизводственного статуса), просто временно переместите все файлы из этого каталога.
  • Используйте модуль проверки файлов, чтобы выяснить, какие файлы «отсутствуют»: это файлы, которые явно не используются. Но любой файл, о котором этот модуль не спорит, ... не используется!
  • Скопировав все отсутствующие файлы в правильное местоположение каталога, который вы хотите проверить, вы затем шаг за шагом воссоздаете идеальное содержимое вашего каталога.

Примечание : несмотря на то, что этот вопрос касается D7, это (альфа-версия) его также для D8.

Pierre.Vriens
источник
Очень полезный подход для решения моей проблемы
kb8
2

есть один модуль , который удаляет ненужные файлы фантазия удаления файлов .

Просмотр всех управляемых файлов с возможностью принудительного удаления их с помощью пользовательских действий VBO. Ручное удаление управляемых файлов с помощью FID (и возможность принудительного удаления, если вы действительно этого хотите). Удаление неиспользуемых файлов из каталога файлов по умолчанию, которых нет в таблице управляемых файлов. АКА удаляет все неуправляемые файлы. Удаление неиспользуемых файлов из всей установки, которые больше не привязаны к узлам и таблице использования файлов. Ака удаляет все потерянные файлы.

vgoradiya
источник
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

Удаления фантазии файл модуль не работает вообще для меня. Вот более ручная альтернатива.

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

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переменную на путь к любой папке, из которой вы хотите удалить файлы (и обновите путь до вашего файла исключений)

Феликс Ева
источник