Столкнулись с проблемой, у клиента есть относительно небольшой сайт, а места занимает достаточно много, что существенно сказывается на годовой стоимости резервного копирования. Возникло подозрение, что есть неиспользуемые файлы.
Эта статья как раз и посвящена поиску таких файлов на Drupal (и не только Drupal) сайте.
Как появляются файлы, которые занимают полезное пространство?
Например на сайте некоторое время назад был раздел со статьями. Позже было решено провести реорганизацию структуры и раздел статей удалили. Текст удалили, а фотографии остались.Та же ситуация может произойти и с каталогом товаров.
Одним словом, ни один из сайтов не застрахован от “мусорных” файлов.
В этой статье, с помощью несложных действий, мы почистим сайт.
Внимание! Перед любыми манипуляциями с сайтом, пожалуйста, сделайте резервную копию.
Критерии оценки не используемых файлов
Определим критерии, по которым файл считается не используемым:
- отсутствует упоминание файла в базе данных
- отсутствует ссылка на файл в исходном коде сайта: тема оформления сайта, стили css, скрипты javascript.
Сделайте дамп базы данных и разместите его в корне сайта
Там же создайте файл с расширением .sh, например dfindfiles.sh и поместите в него следующий код:
#!/bin/sh START=./sites/default/files CURDIR=`pwd` IG_STYLES=./styles/* IG_JS=./js/* IG_CSS=./css/* dbdump=`pwd`/dumpwebsite.sql usedfile=`pwd`/output_used.txt notusedfile=`pwd`/output_notused.txt notusedfile_check=`pwd`/output_notused_check.txt cd ${START} echo "Step 1. Checking for used and unused files to database..." echo "$(date) $line" for file in `find . ! -path "$IG_JS" ! -path "$IG_CSS" ! -path "$IG_STYLES" -type f -print | cut -c 3- | sed 's/ /#}/g'` do file2=`echo $file | sed 's/#}/ /g'` file3=`basename $file2` result=`grep -c "$file3" $dbdump` if [ $result = 0 ]; then echo $file2 >> $notusedfile else echo $file2 >> $usedfile fi done cd ${CURDIR} echo "Step 2. Checking files from list not used files..." echo "$(date) $line" for p in $(cat $notusedfile); do grep -rnw --include=*.{module,inc,php,js,css,html,htm,xml} ${CURDIR} -e $p > /dev/null || echo $p >> $notusedfile_check; done echo "Files checking done." echo "Check the following text-file for results:" echo "$notusedfile_check"
Описание скрипта
Скрипт, согласно критериям оценки, состоит из двух частей:
- поиск упоминаний в базе данных
- поиск упоминаний файла в исходном коде сайта
#!/bin/sh
Установка окружения
START=./sites/default/files
Указания начальной директории сканирования. Это то место, в которое загружаются всей файлы сайта. По умолчанию это путь sites/default/files. Для уточнения пути, зайдите в панель управления сайтом на Drupal, перейдите на страницу Конфигурация - Файловая система. Адрес указан в первом поле с именем “Общедоступный путь файловой системы”
CURDIR=`pwd`
Установка текущего расположения файла, содержащего этого код
IG_STYLES=./styles/*
Игнорирование директории, в которой генерируются картинки
IG_JS=./js/*
Игнорирование директории, в которой генерируются файлы js
IG_CSS=./css/*
Игнорирование директории, в которой генерируются файлы css
dbdump=`pwd`/dumpwebsite.sql
Указание дампа базы данных
usedfile=`pwd`/output_used.txt
Указание файла со списком используемых файлов на сайте
notusedfile=`pwd`/output_notused.txt
Указание файла со списком, которые не найдены в базе данных
notusedfile_check=`pwd`/output_notused_check.txt
Это те файлы, которые можно смело удалять
cd ${START}
Переход в точку старта сканирования
echo "Step 1. Checking for used and unused files to database..."
Вывод сообщение о начале первого шага поиска
echo "$(date) $line"
Вывод даты и времени старта первого шага
for file in `find . ! -path "$IG_JS" ! -path "$IG_CSS" ! -path "$IG_STYLES" -type f -print | cut -c 3- | sed 's/ /#}/g'` do file2=`echo $file | sed 's/#}/ /g'` file3=`basename $file2` result=`grep -c "$file3" $dbdump` if [ $result = 0 ]; then echo $file2 >> $notusedfile else echo $file2 >> $usedfile fi done
Цикл поиска файлов по первому критерию.
Устанавливаются директории для игнорирования, в именах файлах пробелы заменяются на “#}”.
Внутри цикла имена файлов приводятся к первоначальному виду и имя файла ищется в дампе базы данных. Если файл найден, то его путь записывается в файл output_used.txt, иначе - в файл output_notused.txt
cd ${CURDIR}
Происходит переход в корневую директорию сайта
echo "Step 2. Checking files from list not used files..."
Вывод сообщение о начале второго шага
echo "$(date) $line"
Вывод даты и времени старта второго шага
for p in $(cat $notusedfile); do grep -rnw --include=*.{module,inc,php,js,css,html,htm} ${CURDIR} -e $p > /dev/null || echo $p >> $notusedfile_check; done
Выполняется цикл, в котором происходит поиск файлов из списка output_notused.txt. Если файл находится то он выводится в пустое устройство /dev/null, иначе - записывается в файл output_notused_check.txt
echo "Files checking done." echo "Check the following text-file for results:"
Вывод сообщения о завершении поиска
echo "$notusedfile_check"
Вывод файла с конечными результатами
В файле output_notused_check.txt находятся файлы, готовые к удалению.
Скопируйте этот файл в директорию старта сканирования. В нашем примере это sites/default/files.
Перейдите в ту же директорию и выполните команду:
xargs rm -fr < output_notused_check.txt
Здесь происходит удаление файлов из файла output_notused_check.txt
После удаления зайдите на сайт и убедитесь, что все изображения загружаются и отображаются.
Далее перейдите в корень сайта и удалите файлы: dumpwebsite.sql, output_used.txt, output_notused.txt и output_notused_check.txt.
Удачного поиска!
При обработке скрипта возникают две проблемы.
В output_used.txt не попадают файлы имеющие пробел в начале имени.
В output_notused_check.txt после пробела в имени файла начинается новая строка. в output_notused.тхт имена отображаются корректно.
Необходимо поставить "" у переменной $file2 в
echo "$file2" >> $notusedfile
else
echo "$file2" >> $usedfile
иначе в случае если в имени файла присутствует несколько пробелов подряд - данная команда их объединяет в один.
После запуска появляется ошибка:'findfiles.sh: line 15: syntax error near unexpected token `do
Не подскажите в чем ошибка?
Спасибо! Классная статья! наконец-то решил проблему с ненужными файлами.
для данной задачи также можно использовать модуль - https://www.drupal.org/project/fancy_file_delete
Для нашей задачи этот модуль не подходит, потому что я так понял этот модуль смотрит только прикрепленные файлы, а если например файл просто закачали на сайт и прописали в body тег img, то этот случай модуль fancy_file_delete не сможет отработать.