Бесплатные фотохостинги хороши в кроткой перспективе, в долгосрочной они или превращаются в хостинги с адульт рекламой или закрываются! Что и случилось с radikal.ru на 15-ом году работы, фан сайты тире форумы живут гораздо дольше(ну если их админит настоящий фанат)! Все равно огромное им спасибо, очень они помогли в ранние годы российского хостинга, сейчас на западном хостинге уже нет проблем с местом или мощностями!
Так имеем форум phpBB с почти 2М записями. Берем комп на Ubuntu(или Windows с WSL теоритически) выкачиваем дамп базы MYSQL форума 3Gb.
Делать все надо было когда Radikal еще работал!
Задача 1: Вытащить ссылки на фото radikal
Логика такая все фотки в постах в тегах [img] [/img] если большие, а если маленькие превью то в тех же тегах только в имени файла на конце буква t
Тэг img иногда записан большими буквами
меняю все маленькие на большие
sed 's/\[img\]/[IMG\]/g
sed 's/\[\/img\]/[\/IMG\]/g'
Первый скрипт для обработки
vi 1.sh
вставляю
#!/bin/bash IFS=$'IMG\]' cat mysqldump.sql | sed 's/\[IMG\]/\n/g; s/\[\/IMG\]/\n/g' | grep radikal > 1.txt
запускаю скрипт
bash ./1.sh
Тут я поставил конец строки чтобы был IMG] и он сработал как бы.
Дальше вытаскиваю строки которые начинают с http
cat 1.txt | grep ^http > url1.txt
это сразу дало массу ссылок
но еще вытаскиваю строки которые начинают с
cat 1.txt | grep ^'' > url2.txt
тут надо смотреть, сначала какие строки нам нужны с чего начинают, а потом из них убирать ненужное
для utl2.txt
cat url2.txt | sed "s/
cat url3.txt | sed "s/<\/s>//g" > url4.txt
перед тем как использовать эти файлы убираю из них дупликаты
sort ./url1.txt | uniq >> url1f.txt
sort ./url4.txt | uniq >> url4f.txt
остаемся с файлами url1f.txt и url4f.txt
Задача 2: Выкачать по ссылкам фото с radikal
Чуть сложнее чем заголовок. Из ссылок вытащить имя папки, сделать у себя такую же папку, и скачать фото туда.
vi 2.sh
вставляю
#!/bin/bash IFS=$'\n' c=0 for a in $( cat url1f.txt ); do link=`echo $a` name=`echo $link | awk -F '/' '{print $(NF)}'` link2=`echo $a | sed "s/t.jpg/.jpg/g"` name2=`echo $link2 | awk -F '/' '{print $(NF)}'` folder=`echo $link | sed "s/$name//g" | sed "s/http:\/\///g" | sed "s/https:\/\///g"` folder2=`echo $folder | sed "s/radikal.ru/mywebsite/g"` let c++ curl --max-time 20 -O $link2 mkdir -p ./$folder2 mv ./$name2 ./$folder2$name echo $folder "mywebsite.ru/d/mlr/"$folder2 >> url_sql_1.txt echo $c > proc1.txt sleep 0.5 done
запускаю скрипт
bash ./2.sh
ВАЖНО: Если файлов много, как у меня, то эту команду надо запускать в фонов режиме, а то может сеанс порваться, комп вырубится и пр
nohup bash ./2.sh &>/dev/null &
Заметил что превью было только у jpg поэтому все t.jpg меняю на .jpg для выкачивания но для имяни файла оставлю t.jpg — чтобы меньше было менять в постах на форуме
В файл url_sql_1.txt пишутся ссылки и папки
s001.radikal.ru/i193/1001/35/ mywebsite.ru/d/mlr/s001.mywebsite/i193/1001/35/
В файл proc1.txt пишется количество обработанных ссылок, для контроля процесса
Чтобы процесс ускорить запускаю два скрипта, второму даю список ссылок но перевернутый чтобы он качал с конца — все имена файлов меняю чтобы они не перезаписывали друг друга
sort -r url1f.txt >> url1fR.txt
ОСТОРОЖНО: Каждый шаг визуально контролировал, потому что иногда вылезало что-то лишнее. Например не все ссылки на радикал с одним субдоменном были и с двумя это учитывал в отдельном скрипте
ПРОШЛО 60 ЧАСОВ
Да качается не быстро, хотя качал с сервера на сервер, наверное надо было разбивать файлы с ссылками на более мелкие и запускать сотню скриптов.
Задача 3: Меняем в базе MySQL старые ссылки на новые
Тут я долгое время заблуждался что смогу в базе с 2 миллионами строк сделать 600 тысяч запросов найти и заменить, остановив форум всего на пару часов, выкачав базу к себе на домашний комп… На хостинге одна такая операция занимает 12 секунд, дома 9 секунд, всего потребовалось бы 10 дней!!!
MySQL не умеет в параллельные запросы совсем…
Уф но вовремя понял что не надо менять всю ссылку, достаточно домен с субдоменом так как у меня сохранились наименования папок с радикала — это сократило количество операций до 200.
Для этого формирую sql запросы скриптом
vi 3.sh
вставляю
#!/bin/bash IFS=$'\n' c=0 sort ./url1f.txt | uniq -u > url1fu.txt for a in $( cat url1fu.txt ); do let c++ a1=`echo $a | awk '{print $1}'` b1=`echo $a | awk '{print $2}'` echo "UPDATE phpbb_posts SET \`post_text\` = replace(post_text, \""$a1"\", \""$b1"\");" >> url1fu.sql done
запускаю скрипт
bash ./3.sh
получаю файл со строками
UPDATE phpbb_posts SET `post_text` = replace(post_text, "s018.radikal.ru", "mywebsite.ru/d/mlr/s018.mywebsite");
Кладу этот файл на хостинг, иду там в MySQL
mysql -u root -p
выбираю свою базу
use mybase;
и запускаю файл с коммандами
source /home/myname/url1fu.sql;
Все получилось, проверить все равно не проверишь — потому что половина ссылок уже были не рабочии, и еще чуть чуть ссылок потерялось при экспорте!
Это вот если кто успел отследить, что радикал закрывается…
Как-то мимо меня прошло, так бы спас