Наверное у многих веб-разработчиков (и не только) есть проблема с тестированием больших и сложных регулярок которыми они как-то обрабатывают рабочий контент. Мне приходится делать это постоянно и иногда выражения бывают трудно воспринимаемы просто одной головой. Вот в этой ситуации мне обычно помогает 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