Наверное у многих веб-разработчиков (и не только) есть проблема с тестированием больших и сложных регулярок которыми они как-то обрабатывают рабочий контент. Мне приходится делать это постоянно и иногда выражения бывают трудно воспринимаемы просто одной головой. Вот в этой ситуации мне обычно помогает Regex Coach. Он просто подсвечивает участки которые попадают под выбранное условие. На примере показан простенький реплейс подстроки при помощи регулярки (понятно он же match). Очень удобная штука. Обновлялась в 2008м году. Скачать можно здесь. Интерфейс не выделяется ничем, но оно и не нужно. Обычная рабочая лошадка. Интересно есть ли другие похожие разработки.
основное окно программы![]()
Писался на коленке при помощи гугла. Цель была зарезервировать список папок и список БД mysql с одного хоста.
#!/bin/bash
##################### config
dirs_to_save="/home/ci1.loc /home/smarty /home/TTT"
my_dir_for_backups="/home/captain/backups"
mysql_databases_to_save="content mysql test"
mysql_user_name="root"
##################### /config
target_dir=`date +%F`
backup_dir="$my_dir_for_backups/$target_dir/"
echo "
-------------------------------------------------------------------
ijin reserv_copy script v.1.1 | Wed 02 Sep 2009 02:53:30 PM MSD
hello at: "`date`"
i'll save dump to: "$backup_dir"
-------------------------------------------------------------------
"
# create dir for current dump
mkdir -p $backup_dir
echo "dumping directories:
--------------------"
# pack all src dirs
for cur_dir in $dirs_to_save; do
dst_file=${cur_dir//\//-} # change slashes to -
dst_file=$backup_dir${dst_file/-/}".tar.gz" # remove first - and create full dst file name
echo $cur_dir" -> "$dst_file
tar -czf $dst_file $cur_dir &> /dev/null # no output from tar
done
read -s -p "
enter pass for mysql please: " MYSQL_PASS
echo "
dumping databases:
------------------"
# pack all src databases
for cur_db in $mysql_databases_to_save; do
dst_file=$backup_dir$cur_db".sql"
echo $cur_db" -> "$dst_file
mysqldump -u $mysql_user_name --password=$MYSQL_PASS $cur_db > $dst_file 2> /dev/null ### hide error messages
if [ $? != 0 ] ### result of execution of mysqldump
then
echo "=> WARNING: can't dump database. Check login:pass and privileges."
unlink $dst_file
else
echo "=> OK: "$cur_db" dumped ok. I'll gzip it now.."
gzip $dst_file
fi
done
echo "
-------------------------------------------------------------------
all done.
bye at: "`date`"
"
sleep 1
Естественно прав на папки и базы у пользователей должно хватать. Вывод будет примерно такой:
REM plink -N -L local_port:remote_localhost:remote_port remote_host_user@remote_host
plink -N -L 4500:localhost:3306 lala@lala-host.ru
Где:
- lala - имя юзера
- lala-host.ru - ваш хост
- -N - не стартовать шелл, коммандная строка не нужна
- -L - [listen-IP:]listen-port:host:port форвард локального порта на удаленный адрес
ssh -N -f -L local_port:remote_localhost:remote_port remote_host_user@remote_host
В примере мы вешаем на свою локальную машину, на порт 4500 коннект к удаленному 3306 порту мускуля через ssh соединение. Потом берем любой клиент для бд и подключаемся к локалхосту на порт 4500. И все дела. Естественно должен быть шелл-доступ к удаленному хосту с мускулем и plink должен оставаться запущенным и авторизованным на время работы с бд.
Как? Погуглив... Нашел. Оказалось совсем несложно, как обычно..
# для директорий используем -type dХороший человек объяснил подробности. ";" - терминатор екзека и шелла одновременно, поэтому его в шелле надо заэксейпить. Ну а "{}" результат файнда построчно.
cd /home/target_dir
find . -type d -exec chmod 755 {} \;
# для файлов -type f
cd /home/target_dir
find . -type f -exec chmod 644 {} \;
# по маске имени с параметром -name
cd /home/target_dir
find . -type f -name '*.htm*' -exec chmod 644 {} \;
# для наглядности можно выполнить
find /home/target_dir/ -type f -name '*.php' -exec echo '-- '{} \;
Простенько двигаемся по папочкам и просто так считаем чего сколько. Для *nix придется сменить слеш в пути. А работать всё равно будет.
import os
# settings: src dir
sSrc='d:\\Install'
def show_all(sSrc,iDirs=0,iFiles=0):
for file in os.listdir(sSrc):
# full pathname
file=os.path.join(sSrc,file)
if os.path.isdir(file):
# if directories
print '['+file+']'
iDirs+=1
iDirs,iFiles=show_all(file,iDirs,iFiles)
else:
# else files
print ' '+file
iFiles+=1
return iDirs,iFiles
iDirs,iFiles=show_all(sSrc,0,0)
print """
total dirs: """,iDirs,"""
total files: """,iFiles