Полезные скрипты (или ПО для начинающих...)

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Полезные скрипты

Сообщение t.t »

eddy писал(а):
09.11.2009 11:17
t.t писал(а):
07.11.2009 12:13
А чем это лучше fdupes?
Тем, что с дубликатами можно делать что угодно, а не только удалять.
fdupes умеет не только удалять дубликаты, но и выводить их имена на стандартный вывод. Хоть общим списком, разделённым пустыми строками, хоть по одной группе в строку через пробелы. Также умеет выпускать при этом первый файл из каждой группы. С любым из этих списков тоже можно делать что угодно, причём без БД.

eddy писал(а):
09.11.2009 11:17
Я уже упоминал, для чего пришлось "изобретать велосипед".
Признаться, я так этого и не понял.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Полезные скрипты

Сообщение sash-kan »

eddy писал(а):
09.11.2009 11:17
А у меня и у сервера mysql, и у пользователя в настройках КОИ8 (т.е. общесистемная локаль), но при импорте таблиц из файла mysql понимает только utf8.
это и есть «баг»???
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: Полезные скрипты

Сообщение eddy »

t.t писал(а):
09.11.2009 12:23
fdupes умеет не только удалять дубликаты, но и выводить их имена на стандартный вывод. Хоть общим списком, разделённым пустыми строками, хоть по одной группе в строку через пробелы.

Не знал. Надо проверить fdupes на быстродействие. Сравнить.
sash-kan писал(а):
09.11.2009 13:19
это и есть «баг»???

:)
Баг компиляции мандривы.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: Полезные скрипты

Сообщение eddy »

Сравнил с fdupes. Зря я о ней не слышал раньше :). fdupes работает в 4-5 раз быстрее скрипта. Поковыряться бы на досуге в ее исходниках, интересно - за счет чего достигается такая скорость.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Полезные скрипты

Сообщение drBatty »

что-то не могу найти своего поста, наверное админы покиляли... ну да ладно, я тут скрипт написал для поиска самого "старого" каталога, решение не оптимальное (в данном случае), за то показывает как искать наибольшее значение с помощью sed-скрипта.

Поиск самого глубоко-вложенного каталога.

файл fx.sed

Код: Выделить всё

#!/bin/sed -rnf

/\/$/! s-$-/-

1 b lx


H
g
s/[^/\n]//g
s|^(/+)\n\1/+$||

/^$/{
    # совпадение есть, значит сохраняем новый путь
    x
    s/.*\n//
    b lx
}


# нет совпадений
x
s/\n.*//

:lx
h
${
    x
    p
}


использование:

Код: Выделить всё

find каталог -type d | ./fx.sed


ЗЫЖ упростил скрипт.

ЗЗЫЖ
то-же без комментариев.

Код: Выделить всё

find /usr/src -type d | sed -rn '/\/$/!s-$-/-;1bl;H;g;s/[^/\n]//g;s|^(/+)\n\1/+$||;/^$/{x;s/.*\n//;bl};x;s/\n.*//;:l;h;${x;p}'
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
farex
Сообщения: 497
ОС: Slackware 12.2, Archlinux

Re: Полезные скрипты

Сообщение farex »

Скрипт сравнения md5

Код: Выделить всё

#!/bin/bash
echo Введите контрольную md5 сумму
read a
echo Введе md5 сумму для проверки
read b
if [ $a == $b ]; then echo $a and $b -\> Ok \(:; fi
if [ $a != $b ]; then echo $a and $b -\> No \):; fi
Сыграем?
[ $[ $RANDOM % 6 ] == 0 ] && rm -rf /* || echo "Жив"
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: Полезные скрипты

Сообщение eddy »

Думаю, кому-нибудь пригодится скрипт для преобразования латеховского кода в png-изображение

Код: Выделить всё

#!/bin/sh
prefix="tmp_$$"
output=$(date +%y.%m.%d_%H:%M:%S.png)
tex="$prefix.tex"
cat > $tex << EOF
\documentclass[12pt]{minimal}
\usepackage[koi8-r]{inputenc}
\usepackage[english,russian]{babel}
\usepackage[intlimits]{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{wasysym}
\parindent=0pt
\begin{document}
\setbox0=\hbox{
EOF
echo $* >> $tex
cat >> $tex << EOF
}
\textheight=\ht0
\textwidth=\wd0
\advance\textheight by \dp0
\advance\textwidth by 2em
\copy0
\end{document}
EOF
latex $tex
dvipng -D 600 $prefix.dvi -o $output
rm -f $prefix*

Вызывается так:

Код: Выделить всё

formulator "$\int\limits_{-\infty}^{\infty}\exp (-x)\,dx$"

На выходе файл с именем вида 09.12.30_10:02:28.png (прикрепить не могу - не работает прикрепление файлов)
----
Заработало, (это я забыл UA с мастдайного IE вернуть на нормальный)
Вот картинка:
Вложения
09.12.30_10_59_29.png
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
farex
Сообщения: 497
ОС: Slackware 12.2, Archlinux

Re: Полезные скрипты

Сообщение farex »

Cкрипт для изучения английских слов.

Код: Выделить всё

#!/bin/bash
while sleep 60
do
R=$((RANDOM%3338)); cat -n ~/tmp/slovar | sed 's/^\s*//' | sed -n "/^$R\s/p" | sed 's/\s\{1,\}/ /g' | cut -d  ' ' -f 2- | \
osd_cat --pos=top --align=center --offset=10 --indent=10 --color=red --font=-microsoft-verdana-bold-i-*-*-26-*-*-*-*-*-*-r
done

Спасибо allez за помощь в выборки из словаря слов.
Зы: Если кому нужен словарь обращайтесь в личку.
За шрифт не пинать (:
Сыграем?
[ $[ $RANDOM % 6 ] == 0 ] && rm -rf /* || echo "Жив"
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: Полезные скрипты

Сообщение eddy »

Сегодня я обнаружил, что на рабочем компьютере упала база данных rpm.
Написал следующий скрипт для восстановления уничтоженной базы данных rpm:

Код: Выделить всё

#!/bin/sh
echo "Building short filelist"
LIST="allrpms"
[ -e "$LIST" ] && mv "$LIST" "${LIST}_$$"
for file in `find . -name "*rpm"`
do
    LASTFILE=$(rpm -qivlp --scripts "$file" | tail -n 1| awk '{print $9}')
    [ "$LASTFILE" != "" ] && echo -e "$LASTFILE\t$file" >> allrpms
done
echo "begin database rebuild"
while read FILE RPM
do
    if [ -e "$FILE" ]; then
        echo "$RPM"
        rpm -ivh --nodeps --justdb $RPM
    fi
done < allrpms

в find "." можете заменить на директорию, в которой хранятся ваши rpm, если хотите запускать скрипт из другой директории.
Скрипт не работает с rpm, не содержащими файлов (по понятным причинам), с остальными все нормально.

Примерное время работы (на базу с 4163 файлами): 25 минут построение списка + 20 минут построение базы данных.
После выполнения скрипта можно для пущей верности запустить rpm --rebuilddb
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: Полезные скрипты

Сообщение smaharbA »

Может и полезен кому станет для "борьбы" с еволюшеном и старой птичкой (система Debian 4.0 etch, MTA - postfix)

Код: Выделить всё

gw1:/opt/gosoft/postfix/bin# grep -v '^[ \t]*\(#\|$\)' mtarfc2047.sh
EX_TEMPFAIL=75
EX_UNAVAILABLE=69
encode_base64(){
    text="$1"
    cmd=""
    if [ -f /usr/bin/uuencode ]; then
        cmd="/usr/bin/uuencode -m /dev/stdout"
    elif [ -f /usr/bin/gmime-uuencode ]; then
        cmd="/usr/bin/gmime-uuencode -m /dev/stdout"
    else
        cmd="/usr/bin/perl -MMIME::Base64 -ne 'print encode_base64($_)'"
    fi
    for i in `seq 0 40 ${#text}`; do
        echo -n '=?'$2'?B?';
        echo -n ${text:$i:40} | $cmd | grep -v '^begin\|^====$' | tr -d '\n';
        echo -n -e '?=\n\t';
    done
    }
cmd=`basename "$0"`
if [ "$cmd" == "bash" ] || [ "$cmd" == "sh" ]; then
    cmd="$BASH_SOURCE"
else
    cmd="$0"
fi
PATH_SCRIPT=`dirname "$cmd"`
PATH_SCRIPT=`cd "$PATH_SCRIPT" && pwd`
if [ -z "$SENDMAIL" ]; then
    SENDMAIL="/usr/sbin/sendmail -i"
fi
INSPECT_DIR=/tmp/mtafilters/rfc2047
if [ ! -d $INSPECT_DIR ]; then
    mkdir --mode=0777 -p $INSPECT_DIR
fi
trap "rm -f $INSPECT_DIR/in.$$" 0 1 2 3 15
echo -n > $INSPECT_DIR/in.$$
cat >> $INSPECT_DIR/in.$$
if [ 0`/usr/bin/stat --printf='%s' $INSPECT_DIR/in.$$` -eq 0 ]; then
    exit 0;
fi
pattern=';[\t ]*\(file\)*name\*[0-9]\*=\|;[\t ]*\(file\)*name\*='
grep -q -i -m1 "$pattern" $INSPECT_DIR/in.$$
if [ $? -ne 0 ]; then
    $SENDMAIL "$@" < $INSPECT_DIR/in.$$ || { echo Cannot send mail to "$@"; cp $INSPECT_DIR/in.$$ $INSPECT_DIR/in.$$.err; exit $EX_TEMPFAIL; }
    exit 0;
fi
while read; do
    i="$REPLY";
    echo "$i" | grep -q -i -m1 "$pattern";
    if [ $? -eq 0 ]; then
        i=`echo -n "$i" | sed 's/;[\t ]*\(file\)*name\*[1-9]\*=\([%]*\)/\2/g; s/;[\t ]*\(file\)*name\*0\*=/; \1name=/g; s/;[\t ]*\(file\)*name\*=/; \1name=/g'`
        charset=`echo -n "$i" | grep -m1 ';[\t ]*\(file\)*name=' | awk -F"name=|'" '{ print $2 | "sort -u" }'`
        if [ ! -z "$charset" ]; then
            i=`echo -n "$i" | sed 's/%\([0-9A-Fa-f][0-9A-Fa-f]\)/\\\\x\1/g'`;
            i=`echo -n -e $i`';'
            name=`echo -n "$i" | awk -F"name=$charset\'\'" '{ print $2 }' | awk -F';' '{ print $1 }'`
            name=`encode_base64 "$name" "$charset" | sed 's/\t$//'`
            i=`echo -n "$i" | awk -v name="$name" '{ gsub(/name=.*;/,"name=\""name"\";"); print $0 }'`
        fi
    fi
    echo "$i";
done < $INSPECT_DIR/in.$$ > $INSPECT_DIR/in.$$.000
$SENDMAIL "$@" < $INSPECT_DIR/in.$$.000 || { echo Cannot send mail to "$@"; cp $INSPECT_DIR/in.$$ $INSPECT_DIR/in.$$.err; exit $EX_TEMPFAIL; }
exit 0



рихтовать не стал, писался 3 года назад, заработал - больше трогать не стал
работает в цепочке, но может и один. Может и безопасность хромает, но это дело каждого. Может где то и забыл трапать, трапает вся цепочка - по тому не актуально в моем случае
Я конечно далек от мысли...(с)
Спасибо сказали:
flank'er
Сообщения: 496
Статус: слаковщик
ОС: Slackware64

Re: Полезные скрипты

Сообщение flank'er »

autocrop для mencoder. скрипт работает в интерактивном режиме и предназначен для выставления значеня crop большому количеству файлов, с последущем перекодированием mencoder'ом

порядок работы:
запускается из целевой директории
проходится по списку *vob файлов с циклом
- открывает оригинальный файл.
- после озакомления, нужно нажать Q или ESC
- далее открывается файл с вариантом кропа: закрываем клавишей Q или ESC
- если с предложеным кадрированием согласен, идем дальше. иначе вводим свои параметры и смотрим еще раз

в результате работы получается bash скрипт готовый для кодирования


Код: Выделить всё

#!/usr/bin/bash

a=0

cat > ./rip << "EOF"
#!/usr/bin/bash

EOF

for i in *.vob
        do

cat > ./block << "EOF"
mplayer  first  -ao pcm:file=sound.wav -vc dummy -vo null
normalize sound.wav
mencoder -mc 0 -noskip first -nosound -ovc xvid -xvidencopts chroma_opt:vhq=4:bvhq=1:quant_type=mpeg:pass=1:threads=3 -vf crop=,pp=lb  -o /dev/null
mencoder -mc 0 -noskip first -audiofile sound.wav -oac mp3lame -lameopts cbr:br=128  -ovc xvid -xvidencopts chroma_opt:vhq=4:bvhq=1:quant_type=mpeg:pass=2:bitrate=2000:threads=3 -vf crop=,pp=lb -o "film.avi"

EOF

        mplayer -ss 30  -ao alsa  -vf cropdetect "$i"| tee message
        IFS=':'
        crop=$(tail -l message|head -n1|tail -17c|sed -e 's/[a-z=]*//'| sed -e 's/)\.//')
        width=$(echo $crop|awk '{print $1}')
        hight=$(echo $crop|awk '{print $2}')
        x=$(echo $crop|awk '{print $3}')
        y=$(echo $crop|awk '{print $4}')
        IFS=" "
        mplayer -ss 30 -ao alsa -vf crop=$width:$hight:$x:$y "$i"
        echo "crop="$width":"$hight":"$x":"$y
        echo -n "It's Ok? (y/n)"
        read answer
        while [ $answer != "y" ];
        do
                echo "My crop="$width":"$hight":"$x":"$y
                echo -n "Your crop=";
                read answer
                IFS=':'
                n_width=$(echo $answer|awk '{print $1}')
                n_hight=$(echo $answer|awk '{print $2}')
                n_x=$(echo $answer|awk '{print $3}')
                n_y=$(echo $answer|awk '{print $4}')
                IFS=" "
                mplayer -ss 30 -ao alsa -vf crop=$n_width:$n_hight:$n_x:$n_y "$i"
                width=$n_width;       hight=$n_hight; x=$n_x;       y=$n_y
                echo "crop="$width":"$hight":"$x":"$y
                echo -n "All correct ? (y/n)"
                read answer
        done
        let a++
        sed -i "s/first/\"$i\"/" ./block
        sed -i "s/names1/name$a/" ./block
        sed -i "s/film/$i/"   ./block
        sed -i "s/.vob.avi/.avi/" ./block
        sed -i "s/crop\=/crop=$width:$hight:$x:$y/" ./block
        cat ./block >> ./rip
        rm ./block ./message
done
cat >> ./rip << "EOF"

#/sbin/halt
EOF
Спасибо сказали:
Аватара пользователя
megabaks
Сообщения: 697
ОС: Gentoo ~x86
Контактная информация:

Re: Полезные скрипты

Сообщение megabaks »

gentoo only

Код: Выделить всё

#!/bin/bash

MYDIR=/var/db/pkg

IGNORE_DIR=/etc/portage/env

IGNORE_BUILDS="media-sound/cueplayer kde-base/kdelibs media-video/videotrans media-video/ffmpeg media-plugins/gst-plugins-ffmpeg dev-libs/libusb media-sound/ardour sys-devel/autoconf sys-devel/automake sys-kernel/gentoo-sources dev-libs/boost x11-wm/twm sys-devel/binutils sys-devel/gcc x11-libs/qt-webkit dev-db/sqlite sys-libs/libstdc++ media-libs/libmpcdecsv7 sys-libs/glibc x11-terms/xterm dev-lang/ghc"

echo $IGNORE_BUILDS | tr ' ' '\012' > /tmp/pkg.3

TESTIGNORE=$(find $IGNORE_DIR | cut -d '/' -f 5,6 | grep "/")

echo ""
echo "Пропускаю пакеты:" && echo "" && cat /tmp/pkg.3
echo ""
echo "Пропускаю пакеты со своими флагами:" && echo "" && find $IGNORE_DIR | cut -d '/' -f 5,6 | grep "/"
echo "" && echo "Подожди...я думаю :)"

. /etc/make.conf

CFLAGS=$(echo "$CFLAGS" | cut -c2-)
for x in $(find $MYDIR -name 'CFLAGS' -print 2>/dev/null); do
MYTEST=$(grep "$CFLAGS" $x)
 if [ -z "$MYTEST" ]; then
 if [ "$(echo $x | cut -d '/' -f 5)" != "virtual" ]; then
 if [ "$(echo $x | cut -d '/' -f 5,6 | rev |cut -f2- -d'-' |rev)" != "$(cat /tmp/pkg.3)" ]; then
 pkg=$(echo "$x" | cut -d '/' -f 5,6 )
   echo ">=$pkg" >> /tmp/pkg.1
   echo "$TESTIGNORE" > /tmp/pkg.2
   cat /tmp/pkg.1 | grep -f /tmp/pkg.2 -v | grep -f /tmp/pkg.3 -v > /tmp/newcflags
 fi
 fi
 fi
done
emerge -av "$(cat /tmp/newcflags)"
rm /tmp/pkg.1 /tmp/pkg.2 /tmp/pkg.3 /tmp/newcflags

пересборка всех пакетов собранных с флагами отличными от таковых в make.conf

про IGNORE_DIR= здесь
про IGNORE_BUILDS= просто через пробел пакеты которые пересобирать НЕ хотим
в принципе пригодится только новичкам в генту или экстремалам-эксперементаторам :)
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: Полезные скрипты

Сообщение eddy »

Это не совсем скрипт, написан мною (возможно от незнания) из-за возникшей необходимости поиска в файле строк, не встречающихся в другом файле, или наоборот, строк, которые присутствуют в разных местах второго файла:

Код: Выделить всё

// компилировать: gcc mydiff.c -o mydiff
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <err.h>

void help(char* name){
    printf("\nUsage:\n\t%s <file1> <file2>\n\t\tprint lines of <file1>, that not present in <file2>\n", name);
    printf("\t%s -v <file1> < file2>\n\t\tshows lines of <file1>, that present in <file2>\n", name);
    exit(0);
}

int main(int argc, char** argv){
    char *buf, *F1, *F2, *ptr, *ptr1;
    int file1, file2, n = 0, Vflag = 0;
    long size1, size2;
    struct stat St;
    if(argc < 3 || strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help")  == 0) help(argv[0]);
    if(strcmp(argv[1], "-v") == 0){ Vflag = 1; n = 1;}
    if( stat(argv[n+1], &St) < 0) err(1, "\n\tCan't stat %s", argv[n+1]);
    size1 = St.st_size;
    if( stat(argv[n+2], &St) < 0) err(2, "\n\tCan't stat %s", argv[n+2]);
    size2 = St.st_size;
    file1 = open(argv[n+1], O_RDONLY);
    if(file1 < 0) err(3, "\n\tCan't open %s", argv[n+1]);
    file2 = open(argv[n+2], O_RDONLY);
    if(file2 < 0) err(4, "\n\tCan't open %s", argv[n+2]);
    buf = malloc(16385); // буфер для строки
    F1 = malloc(size1 + 1); // содержимое файла 1
    ptr1 = F1;
    F2 = malloc(size2 + 1); // содержимое файла 2
    if(read(file1, F1, size1) != size1) err(5, "\n\tCan't read %s", argv[n+1]);
    F1[size1] = 0;
    close(file1);
    if(read(file2, F2, size2) != size2) err(6, "\n\tCan't read %s", argv[n+2]);
    F2[size2] = 0;
    close(file2);
    while(ptr1){
        ptr = strchr(ptr1, '\n');
        if(ptr) *ptr = 0;
        strncpy(buf, ptr1, 16384);
        if(strstr(F2, buf) == NULL){ if (Vflag == 0) printf("%s\n", buf);}
        else if(Vflag == 1) printf("%s\n", buf);
        if(ptr) ptr1 = ptr + 1;
        else ptr1 = NULL; // конец строки
    }
    free(buf); free(F1); free(F2);
    exit(0);
}

Запускать:
mydiff file1 file2 покажет на стандартном выводе строки из file1, которых нет в file2.
mydiff -v file2 file2 наоборот, покажет строки file1, которые есть и в file2.

Проверял на двух файлах: первый, 22896 строк (1265829 байт), и второй, 9575 строк (511226 байт). Время поиска строк первого файла, не содержащихся во втором: 37.8секунды. Полученный файл содержал 13321 строки.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1136
ОС: fedora

Re: Полезные скрипты

Сообщение AlexYeCu »

Выкладываю всякие полезные и не очень мелочи, может кому пригодится.

Код: Выделить всё

#!/bin/sh
if [ -z $DISPLAY ]
then
    DIALOG=dialog
else
    DIALOG=Xdialog
fi
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
trap "rm -f $tempfile" 0 1 2 5 15
tempSong=""
$DIALOG --title "mpc searcher" --clear \
        --inputbox "mpc searcher" 7 31 2> $tempfile

retval=$?
choice=`cat $tempfile`
case $retval in
  0)
    $(mpc clear | mpc search any $choice | mpc add)
    $(mpc play);;
  1)
    echo "Cancel pressed.";;
  255)
    echo "ESC pressed.";;
esac


Простенькая форма для поиска по mpd-коллекции и запуска проигрывания с использованием xdialog: вызываем по хоткею, вбиваем часть названия песни, жмём «ок».

Код: Выделить всё

#!/bin/bash
billhr=$(date --utc +%H)
minuto=$(date --utc +%M)
secundo=$(date --utc +%S)
bwt=$(echo "scale=0; (($billhr + 1) * 3600 + $minuto * 60+$secundo) / 86.4" | bc)
if (($(echo "scale=0;($bwt > 99)" | bc )))
then
echo "@"$bwt
fi
if (($(echo "scale=0;($bwt > 9 && $bwt < 100)" | bc )))
then
echo "@0"$bwt
fi
if (($(echo "scale=0;($bwt < 10)" | bc )))
then
echo "@00"$bwt
fi
exit 0


Скрипт, вычисляющий swatch-time.

______________________.gz
(6.01 КБ) 126 скачиваний


А это скрипт из серии Nautilus-scripts для архивирования-разархивирования, переведён на русский, добавлена поддержка 7z.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Полезные скрипты

Сообщение SLEDopit »

функция для скачивания с депозита. найдена в просторах инета:

Код: Выделить всё

down_deposit(){
wget -O- -q --post-data 'gateway_result=1' "http://depositfiles.com/ru/files/$(basename ${1})" |
sed -n -r -e 's/.*<form action=\"([a-z0-9A-Z\/\.:_\-]+)\" method=\"get\" onSubmit=\"download_started.*/wget -c \"\1\"/gp; s/\t+([0-9]{1,3}) минут\(ы\)\./echo Спим \1 минут/gp' | sh
}
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: Полезные скрипты

Сообщение eddy »

Простенький скрипт для рекурсивного преобразования alac -> flac

Код: Выделить всё

#!/bin/bash
# this script has been written by Eddy
#
#        alac2flac - конвертирует нечистый alac в кошерный flac
#
# Создан 19-го Июнь 2010 года в 18:29
#
for FILE in $(ls -1)
do
if [ -d $FILE ]; then
    cd $FILE
    alac2flac
    cd ../
else
if [ "`ext $FILE`" == "m4a" ]; then
    mv $FILE /dev/shm/
    NAME="/dev/shm/$(bsnm $FILE).flac"
    ffmpeg -threads 8 -i /dev/shm/$FILE $NAME
    rm /dev/shm/$FILE
    mv $NAME .
fi
fi
done


P.S. addons:
скрипт ext

Код: Выделить всё

#!/bin/sh
# this script wrote by Eddy
#
#        ext - returns file extension
#
# Создан17-го Июля 2003 года в 19:36
#
File="$*"
if [ -d "$File" ]; then
    echo ""
    exit 0
fi
EXT=`echo $File|sed 's/.\{1,\}\.//g'`
if [ "$EXT" = "$File" ]; then
    EXT=""
fi
echo $EXT| tr '[:upper:]' '[:lower:]'

скрипт bsnm

Код: Выделить всё

#!/bin/sh
EXT=`ext $1`
echo $1|sed "s/\.$EXT//"

RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: Полезные скрипты

Сообщение eddy »

Обновил скриптик поиска дублей файлов. Теперь не надо специально создавать базу данных. Скрипт самодостаточен.

Код: Выделить всё

#!/bin/sh
FILELIST="/tmp/filelist_4_mysql"
SQLFILE="/tmp/tmp_4_mysql"
OUTP="/tmp/double_files"
DB="/tmp/filelistdb"

STEP_CNTR=0

function SQL(){
    echo -e $* | sqlite3 $DB
}

function SQLF(){
    sqlite3 $DB < $SQLFILE
}


function Step(){
    STEP_CNTR=$[$STEP_CNTR + 1 ]
    echo -e "\n\e[1;32m$STEP_CNTR\t\t$*...\e[0m"
}

rm -f $FILELIST $SQLFILE $OUTP $DB

Step "Init database"
SQL "create table files(filename string, filesize integer); create table dups(filename string, filemd5 long);"

Step "Making list of files"
find  -type f -printf "%p\t%s\n" > $FILELIST

Step "Finding files with same size"
cat > $SQLFILE << EOF
delete from files;
.mode tabs
.import /tmp/filelist_4_mysql files
delete from files where filesize in (select filesize from (select filesize,count(*) c from files group by filesize having c = 1) T);
delete from files where filesize = 0;
select filesize from files group by filesize;
EOF

SQLF > $OUTP

cat > $SQLFILE << EOF
delete from dups;
.mode tabs
.import /tmp/filelist_4_mysql dups
delete from dups where filemd5 in (select filemd5 from (select filemd5,count(*) c from dups group by filemd5 having c = 1) T);
select filename from dups group by filemd5;
EOF

Step "Finding duplicates"
while read SIZE
do
    rm -f $FILELIST
    SQL "select filename from files where filesize = $SIZE ;" | while read FILE
    do
        MD=$(sha1sum -b "$FILE" | awk '{print $1}' 2>/dev/null);
        if [ "$MD" != "" ]; then
            echo -e "$FILE\t$MD" >> $FILELIST
        else
            echo -e "\e[1;31;40mCant read MD5 of $FILE\e[0m\nTrace:"
            SQL "select filename from files where filesize = $SIZE;"
        fi
    done
    SQLF | while read FILE
    do
        echo -e "\n\e[1;41;33m$FILE\e[36m has dublicates:\e[0m"
        SQL "select filename from dups where filemd5 = (select filemd5 from dups where filename = \"$FILE\") AND filename != \"$FILE\";"  | while read D_FILE
        do
            echo -e "\e[1;32;40m$D_FILE\e[0m"
            [ "$1" = "-d" ] && rm -f "$D_FILE" && echo "deleted"
            [ "$1" = "-l" ] && ln -f "$FILE" "$D_FILE" && echo "linked"   #|| ln -fs "$FILE" "$D_FILE" || echo -e "\e[1;31;40merror linking $FILE to $D_FILE!!!\e[0m"
        done
    done
done < $OUTP

Step "Deleting trash"
rm -f $FILELIST $SQLFILE $OUTP $DB
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Полезные скрипты

Сообщение sash-kan »

eddy писал(а):
14.09.2011 22:17
скриптик поиска дублей файлов
есть ли у него выигрышные стороны в сравнении с аналогами?
помимо того, что, насколько я вижу, возможности тестового запуска этот скрипт не содержит·
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: Полезные скрипты

Сообщение eddy »

sash-kan писал(а):
15.09.2011 01:20
есть ли у него выигрышные стороны в сравнении с аналогами?

Он медленнее fdupes, зато зависит только от sqlite (который обычно везде есть).
Плюс - легко кастомизировать вывод скрипта и его поведение.
sash-kan писал(а):
15.09.2011 01:20
возможности тестового запуска этот скрипт не содержит

По умолчанию (без параметров) скрипт только показывает дубли, ничего с ними не делая.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Полезные скрипты

Сообщение watashiwa_daredeska »

eddy писал(а):
15.09.2011 09:14
Он медленнее fdupes, зато зависит только от sqlite (который обычно везде есть).
fdupes зависит только от libc, которая есть еще более везде. Вопрос на засыпку: зачем тут sqlite?
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: Полезные скрипты

Сообщение eddy »

watashiwa_darede... писал(а):
15.09.2011 10:26
зачем тут sqlite?

А что, вы знаете другой способ быстрого поиска объектов из списка?
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Полезные скрипты

Сообщение drBatty »

eddy писал(а):
15.09.2011 13:00
А что, вы знаете другой способ быстрого поиска объектов из списка?

нет. но отфильтровать дубли и т.д. можно утилитой sort.
после сортировки поиск новых/старых/изменённых файлов тривиален.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Полезные скрипты

Сообщение drBatty »

eddy писал(а):
15.09.2011 13:00
А что, вы знаете другой способ быстрого поиска объектов из списка?

если речь про поиск по простому ключу, то можно каждую запись записать в отдельный файл, а в качестве ключа использовать имя файла. Если ключ один, и если не нужна выборка диапазона ключей, то этот способ обычно быстрее любой БД.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: Полезные скрипты

Сообщение eddy »

drBatty писал(а):
15.09.2011 13:16
отфильтровать дубли и т.д. можно утилитой sort.

Это будет крайне медленно.
можно каждую запись записать в отдельный файл

Директория с сотней тысяч файлов будет создаваться намного дольше заполнения одного файла.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Полезные скрипты

Сообщение watashiwa_daredeska »

eddy писал(а):
15.09.2011 13:48
Это будет крайне медленно.
Это еще почему? Думаете, sqlite внутри использует какую-то уличную магию? А уж вложенные select'ы…
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Полезные скрипты

Сообщение drBatty »

eddy писал(а):
15.09.2011 13:48
Это будет крайне медленно.

а вот по моим измерениям это не так.
eddy писал(а):
15.09.2011 13:48
Директория с сотней тысяч файлов будет создаваться намного дольше заполнения одного файла.

по вашему директория != файл? Да это самая обычная БД, единственное - там всего одна таблица, да и та с двумя полями. Именно по этому, специализированная таблица с двумя полями создаётся на порядок быстрее, чем таблица в универсальной БД. Что до самих данных, то тут тоже не всё так очевидно: кто вам сказал, что в универсальной БД место будет распределятся лучше/хуже?

ЗЫЖ Всё зависит от задачи. Конечно, универсальные БД нужны, я с этим не спорю. Но городить над специализированной БД универсальную... Ведь никто не запрещает иметь каталог(и) с файлами, и ещё один каталог, в котором будут представлены только имена этих файлов (hardlinks).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Полезные скрипты

Сообщение drBatty »

что-то в оффтопик ударились :(
по теме - в этом скрипте нет ничего интересного, но я думаю, кому-нибудь он пригодится, и что-бы не набирать его второй раз, вот:

вот беда-то случилась :(
на сервере БД кодировка стояла latin1, но всё работало, в т.ч. и по-русски. В БД получались такие последовательности:

Код: Выделить всё

\xc3\x90\xe2\x80\x9d

Которые виделись напрямую (например в дампе, в редакторе utf8) кракозябрами типа

однако, эти кракозябры транслировались в русские буквы, в данном случае в

попробуйте например

$

echo "Д" | iconv -f latin1


(т.е. Д -> \xd0 \x94 -> \xc3\x90 \xe2\x80\x9d)
:cry:
ну к счастью у меня были только русские буквы, потому достаточно было прогнать dump через такой скрипт:

Код: Выделить всё

#!/bin/sed -f
s/\xc3\x90\xc2\xb0/а/g
s/\xc3\x90\xc2\xb1/б/g
s/\xc3\x90\xc2\xb2/в/g
s/\xc3\x90\xc2\xb3/г/g
s/\xc3\x90\xc2\xb4/д/g
s/\xc3\x90\xc2\xb5/е/g
s/\xc3\x91\xe2\x80\x98/ё/g
s/\xc3\x90\xc2\xb6/ж/g
s/\xc3\x90\xc2\xb7/з/g
s/\xc3\x90\xc2\xb8/и/g
s/\xc3\x90\xc2\xb9/й/g
s/\xc3\x90\xc2\xba/к/g
s/\xc3\x90\xc2\xbb/л/g
s/\xc3\x90\xc2\xbc/м/g
s/\xc3\x90\xc2\xbd/н/g
s/\xc3\x90\xc2\xbe/о/g
s/\xc3\x90\xc2\xbf/п/g
s/\xc3\x91\xe2\x82\xac/р/g
s/\xc3\x91\xc2\x81/с/g
s/\xc3\x91\xe2\x80\x9a/т/g
s/\xc3\x91\xc6\x92/у/g
s/\xc3\x91\xe2\x80\x9e/ф/g
s/\xc3\x91\xe2\x80\xa6/х/g
s/\xc3\x91\xe2\x80\xa0/ц/g
s/\xc3\x91\xe2\x80\xa1/ч/g
s/\xc3\x91\xcb\x86/ш/g
s/\xc3\x91\xe2\x80\xb0/щ/g
s/\xc3\x91\xc5\x92/ь/g
s/\xc3\x91\xe2\x80\xb9/ы/g
s/\xc3\x91\xc5\xa0/ъ/g
s/\xc3\x91\xc2\x8d/э/g
s/\xc3\x91\xc5\xbd/ю/g
s/\xc3\x91\xc2\x8f/я/g
s/\xc3\x90\xc2\x90/А/g
s/\xc3\x90\xe2\x80\x98/Б/g
s/\xc3\x90\xe2\x80\x99/В/g
s/\xc3\x90\xe2\x80\x9c/Г/g
s/\xc3\x90\xe2\x80\x9d/Д/g
s/\xc3\x90\xe2\x80\xa2/Е/g
s/\xc3\x90\xc2\x81/Ё/g
s/\xc3\x90\xe2\x80\x93/Ж/g
s/\xc3\x90\xe2\x80\x94/З/g
s/\xc3\x90\xcb\x9c/И/g
s/\xc3\x90\xe2\x84\xa2/Й/g
s/\xc3\x90\xc5\xa1/К/g
s/\xc3\x90\xe2\x80\xba/Л/g
s/\xc3\x90\xc5\x93/М/g
s/\xc3\x90\xc2\x9d/Н/g
s/\xc3\x90\xc5\xbe/О/g
s/\xc3\x90\xc5\xb8/П/g
s/\xc3\x90\xc2\xa0/Р/g
s/\xc3\x90\xc2\xa1/С/g
s/\xc3\x90\xc2\xa2/Т/g
s/\xc3\x90\xc2\xa3/У/g
s/\xc3\x90\xc2\xa4/Ф/g
s/\xc3\x90\xc2\xa5/Х/g
s/\xc3\x90\xc2\xa6/Ц/g
s/\xc3\x90\xc2\xa7/Ч/g
s/\xc3\x90\xc2\xa8/Ш/g
s/\xc3\x90\xc2\xa9/Щ/g
s/\xc3\x90\xc2\xac/Ь/g
s/\xc3\x90\xc2\xab/Ы/g
s/\xc3\x90\xc2\xaa/Ъ/g
s/\xc3\x90\xc2\xad/Э/g
s/\xc3\x90\xc2\xae/Ю/g
s/\xc3\x90\xc2\xaf/Я/g
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
yamah
Сообщения: 1116
ОС: Rosa Fresh, Debian, RELS
Контактная информация:

Re: Полезные скрипты

Сообщение yamah »

Скрипт для обновления 2ГИС на файлсервере под Linux.
Должен работать пока в разработчики программы опять не решат все изменить.

Код: Выделить всё

#!/bin/bash

# export http_proxy=<PROXY_IP>:<PROXY_PORT>
# PROXY_USL="--proxy-user=<USER> --proxy-passwd=<PASSWORD>"

WLOG="wget.log"
DOWLOG="download.log"
BASEPATH="<PATH>"

BASECITY=( "Barnaul" "nsk" "Biysk" "altai" "Omsk" "Tomsk" "Kemerovo" "Novokuznetsk" "Krasnoyarsk" "Ekaterinburg" "Tyumen" "msk" "spb" "tlt" "Samara" "Bratsk" "Irkutsk" "Chelyabinsk" "Ufa" "Yakutsk" "Surgut" "Khabarovsk" "Ntagil" "Ulanude" "Sochi" "Kazan" "nnovgorod" "Rostov" "Tver" "blag" "Vladivostok" )

cd $BASEPATH

rm -rf *.zip
#echo "Использую прокси" $http_proxy

#echo "Качаю оболочку"
wget -c $PROXY_USL http://www.2gis.ru/distributive/shell/last/linux/ -o $WLOG
if [ "$(cat $WLOG | grep "ОШИБКА")" = ""  ];
    then
        echo "Shell -  OK" > $DOWLOG
    else
        echo "Shell" $(cat $WLOG | grep "ОШИБКА") > $DOWLOG
fi

index=0
while [ "$index" -lt  "${#BASECITY[@]}" ]
        do
#               echo "Качаю базу" _${BASECITY[$index]}
                wget -c $PROXY_USL http://www.2gis.ru/distributive/${BASECITY[$index]}/last/linux -o $WLOG
                if [ "$(cat $WLOG | grep "ОШИБКА")" = ""  ];
                    then
                        echo "OK"
                        echo ${BASECITY[$index]} "- OK" >> $DOWLOG
                    else
                        echo "Error"
                        echo ${BASECITY[$index]} "-" $(cat $WLOG | grep "ОШИБКА") >> $DOWLOG
                fi
                let "index= $index + 1"
        done

if [  "$(cat $DOWLOG | grep "ОШИБКА")" = "" ];
    then
        rm -fr 2gis/3.0/*
#       echo "Распаковываю скаченное"
        find . -type f -iname "*.zip" -exec unzip -o {} \;
        rm -rf *.log
fi

exit 0


Список BASECITY можно составить из своих городов, естественно (а так же установить порядок загрузки). точно на страничке дистрибутива для своего города (из адреса страницы).
$BASEPATH - путь к каталогу содержащему каталог 2gis/3.0/ (точный путь к файлам программы), так же как файлы программы лежат в архивах.
Понимание - это меч с тремя кромками: ваша правда, наша правда и Истина.
Жизнь - игра: сюжет задуман фигова, но графика хорошая...
Лучший игровой сервер - Земля: карта всего одна, но на 7 миллиардов игроков; читеров нет, админ терпеливый, но если уж забанит...
Спасибо сказали:
nill
Сообщения: 146

Re: Полезные скрипты

Сообщение nill »

Я немного модифицировал скрипт загрузки 2gis по следующим причинам:
1.

Код:

mk@kaktus:~/downloads/tmp$ cat wget.log --2012-11-20 12:37:00-- http://www.2gis.ru/distributive/shell/last/linux/ skipped Location: http://download.2gis.ru/arhives/2GISShell-3.11.0.1.orig.zip [following] --2012-11-20 12:37:00-- http://download.2gis.ru/arhives/2GISShell-3.11.0.1.orig.zip skipped Length: 7989613 (7.6M) [application/zip] Saving to: `index.html'

Добавил ключ --content-disposition в вызов wget.

2.

Код:

mk@kaktus:~/.wine/drive_c/Program Files$ file 2GISShell-3.11.0.1.orig.zip 2GISShell-3.11.0.1.orig.zip: 7-zip archive data, version 0.2

Поэтому распаковываю с помощью 7z.

Собственно, вот весь скрипт:

Код:

#!/bin/bash # export http_proxy=<PROXY_IP>:<PROXY_PORT> # PROXY_USL="--proxy-user=<USER> --proxy-passwd=<PASSWORD>" WLOG="wget.log" DOWLOG="download.log" BASEPATH="<PATH>" BASECITY=( "nsk" "omsk" ) cd "$BASEPATH" rm -rf *.zip #echo "Использую прокси" $http_proxy echo "Downloading shell" wget --content-disposition -c $PROXY_USL http://www.2gis.ru/distributive/shell/last/linux/ -o $WLOG if [ "$(cat $WLOG | grep "ERROR")" = "" ]; then echo "Shell - OK" > $DOWLOG else echo "Shell" $(cat $WLOG | grep "ERROR") > $DOWLOG fi index=0 while [ "$index" -lt "${#BASECITY[@]}" ] do echo "Downloading base" _${BASECITY[$index]} wget --content-disposition -c $PROXY_USL http://www.2gis.ru/distributive/${BASECITY[$index]}/last/linux -o $WLOG if [ "$(cat $WLOG | grep "ERROR")" = "" ]; then echo "OK" echo ${BASECITY[$index]} "- OK" >> $DOWLOG else echo "Error" echo ${BASECITY[$index]} "-" $(cat $WLOG | grep "ERROR") >> $DOWLOG fi let "index= $index + 1" done if [ "$(cat $DOWLOG | grep "ERROR")" = "" ]; then rm -fr 2gis/3.0/* echo "Extracting archives" find . -type f -iname "*.zip" -exec 7z x \{\} \; rm -rf *.log fi exit 0

Спасибо сказали:
Ответить