Поиск не используемых файлов на сайте

Опубликовано malov - ср, 07/29/2015 - 03:46

Столкнулись с проблемой, у клиента есть относительно небольшой сайт, а места занимает достаточно много, что существенно сказывается на годовой стоимости резервного копирования. Возникло подозрение, что есть неиспользуемые файлы.

Эта статья как раз и посвящена поиску таких файлов на 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.

Удачного поиска!

Теги

Для нашей задачи этот модуль не подходит, потому что я так понял этот модуль смотрит только прикрепленные файлы, а если например файл просто закачали на сайт и прописали в body тег img, то этот случай модуль fancy_file_delete не сможет отработать.

При обработке скрипта возникают две проблемы.
В output_used.txt не попадают файлы имеющие пробел в начале имени.

В output_notused_check.txt после пробела в имени файла начинается новая строка. в output_notused.тхт имена отображаются корректно.

Необходимо поставить "" у переменной $file2 в

echo "$file2" >> $notusedfile
else
echo "$file2" >> $usedfile

иначе в случае если в имени файла присутствует несколько пробелов подряд - данная команда их объединяет в один.

Добавить комментарий

  • Допустимые HTML-теги: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd>
  • Строки и абзацы переносятся автоматически.
  • Web page addresses and email addresses turn into links automatically.