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

Материал из Wiki семьи Белых
Перейти к: навигация, поиск

Переконвертирование ID3 тегов

Большинство медиаплейеров в MS Windows записывают теги в нестандартной кодировке, то есть CP1251.

Для переконвертирования их в правильную кодировку можно воспользоваться следующей командой:

Code:
find -iname '*.mp3' -print0 | xargs -0 mid3iconv -eCP1251 --remove-v1

Заменить пробелы подчеркиванием

Заменяет все пробелы на подчеркивание от указанной директории.

Code:
find -name "* *" | sort -r | while read i; do mv "$i" "$(dirname "$i")/$(basename "$i" | tr ' ' _)"; done

Автоматическое перекодирование файлов

Скрипт ищет все файлы txt в текущей директории и перекодирует их из кодировки CP1251 в UTF-8.

Code: massiconv
#!/bin/bash
find . -type f -name "*.txt" | while read i
do
       iconv -f cp1251 -t utf8  "$i" > "${i//.txt/.utf8.txt}"
done

Конвертирование всех видеофайлов в каталоге и его подкаталогах

Для конвертирование используется mencoder

Данный скрипт перекодирует файлы в формате AVI в формат MKV, видеокодек X.264, аудиокодэк AAC (2 канала). Входящий параметр каталог в котором нужно искать файлы для конвертирования.

Code: viconv.sh
#!/bin/sh
vbitrate="4000"
abitrate="320"
achannels="2"
sordir=$1
filters='' # 

VID="-vf harddup,pullup,softskip,"$filters" $framerate -ovc x264 -x264encopts \
threads=auto:psnr:ssim:b_adapt=2:deblock:cabac:chroma_me:subq=9:partitions=all:8x8dct:\
me=umh:nofast_pskip:nodct_decimate:me_range=32:trellis=2:frameref=16:bframes=16:b_pyramid=normal:\
weight_b:mixed_refs:direct_pred=auto:keyint=750:keyint_min=25:no-8x8dct:aq_mode=1:aq_strength=1.0:\
psy_rd=1.0,0.0:bitrate=$vbitrate"

AUD="-aid 1 -oac faac -faacopts br=$abitrate:mpeg=4:tns:object=2 -channels $achannels -af volnorm=2"

for TF in "avi" "AVI" "Avi"; do
    find "$sordir" -type f -name "*.$TF" | while read line
        do
            SOURCE=$line
            FOLD=$(basename $(dirname $SOURCE))
            mkdir -p "VideoConv/$FOLD"
            NAME="VideoConv/$FOLD/$(basename "$SOURCE")"
            if [[ -e $NAME ]]
                then
                    echo "Файл" $NAME "уже существует!"
                    echo "Файл" $NAME "уже существует!" >> vconv.log
                else
                    e="mencoder "$SOURCE" $AUD $VID"
                    time  time $e:pass=1 -o /dev/null && time $e:pass=3 -o /dev/null && time $e:pass=3 \
                      -of lavf -o "$NAME.mkv" && echo "Encoding time:" &> "$log"; rm -v divx2pass.log*  &
                    tail -f "$log"
                    echo "Файл" $NAME "создан!" >> vconv.log
            fi
        done
done

Конвертирование APE во FLAC

Зависимость ffmpeg, flac, apeinfo

Code: Установка ApeInfo 64
 sudo wget http://legroom.net/files/software/apeinfo_64 -O /usr/local/bin/apeinfo
 sudo chmod a+x /usr/local/bin/apeinfo

Код скрипта

Code: ape2flac
#!/bin/bash
# ape2flac 0.2
# convert APE files to FLAC with keeping tags
# 
# you need apeinfo to extract ape tags, just google for it!

RED='\e[1;31m'
BLUE='\e[1;34m'
NC='\e[0m'      # no color

f_flag=0
d_flag=0

usage(){
        echo "ape2flac version 0.2"
        echo
        echo "usage: ape2flac [OPTION] INPUTFILE"
        echo
        echo "options:"
        echo -e "  -f   rename output file to '"$BLUE"TRACKNUMBER - ARTIST - TITLE.flac$NC'"
        echo "  -d      delete input file"
        exit 64         # EX_USAGE
}

setFileVars(){
        INPUTFILE=${1}
        OUTPUTFILE=$(echo $INPUTFILE | sed "s/.ape$/.flac/i")
        FILEPATH=${INPUTFILE%/*}

        if [ "$FILEPATH" = "$INPUTFILE" ]
                then 
                        FILEPATH=".";
        fi
}

if (($# > 0))
        then
                while [ $# -gt 1 ]
                do
                        case $1 in
                                -f)             f_flag=1;;
                                -d)             d_flag=1;;
                        esac
                        shift
                done
                
                if [ -f "$1" ]
                        then                                    
                                setFileVars "$1"
                        else
                                echo -e "Bad news, Harry! There is$RED no file in arguments!$NC"
                                echo
                                usage
                fi
        else
                usage
fi

echo $INPUTFILE

ffmpeg -y -i "$INPUTFILE" "$OUTPUTFILE" 2> /dev/null

ffmpeg_EXITCODE=$?

if (($ffmpeg_EXITCODE))
        then
                #echo $INPUTFILE >> failtoconvert.log
                echo -e "Bad news, Harry! Snape spelled Levicorpus, your$RED ffmpeg goes wrong! ${NC}"
                exit $ffmpeg_EXITCODE
fi

rm -f "${INPUTFILE}".tag 
apeinfo -t "$INPUTFILE" > "${INPUTFILE}".tag
metaflac --import-tags-from="${INPUTFILE}".tag "$OUTPUTFILE"

if (($d_flag))
        then
                rm -f "$INPUTFILE"
fi

if (($f_flag))
        then
                TRACKNUMBER=$(sed -n "s/^TRACKNUMBER=//p" "${INPUTFILE}".tag)
                ARTIST=$(sed -n "s/^ARTIST=//p" "${INPUTFILE}".tag)
                TITLE=$(sed -n "s/^TITLE=//p" "${INPUTFILE}".tag)
                mv "$OUTPUTFILE" "$FILEPATH/$TRACKNUMBER - $ARTIST - $TITLE.flac"
                OUTPUTFILE="$TRACKNUMBER - $ARTIST - $TITLE.flac"       
fi
rm -f "${INPUTFILE}".tag

echo -e "$FILEPATH/$OUTPUTFILE ${BLUE}..done! ${NC}"
exit 0

Источник

Перевод русских имен файлов в транслит

Code: translite
#!/bin/sh
# this script has been written by Eddy
# rename_translit --- переводит русские имена файлов в транслит
# Создан 22-го Май 2006 года в  9:24
#
for Name in `ls -1`
do
    Newname=`echo "$Name"|sed -e \
    "y/йукенгзхъфывапролдэсмитьбЙУКЕНГЗХЪФЫВАПРОЛДЭСМИТЬБ/jukengzh'fyvaproldesmit'bJUKENGZH'FYVAPROLDESMIT'B/"\
    -e "s/ц/tz/g"       \
    -e "s/ш/sh/g"       \
    -e "s/щ/sch/g"      \
    -e "s/ж/zh/g"       \
    -e "s/ч/ch/g"       \
    -e "s/ю/yu/g"       \
    -e "s/я/ya/g"       \
    -e "s/Ц/TZ/g"       \
    -e "s/Ш/SH/g"       \
    -e "s/Щ/SCH/g"      \
    -e "s/Ж/ZH/g"       \
    -e "s/Ч/CH/g"       \
    -e "s/Ю/YU/g"       \
    -e "s/Я/YA/g"`
    if [ "$Name" != "$Newname" ]; then
        mv "$Name" "$Newname"
        echo -e "$Name   ->    $Newname\r\c"
    fi
    if [ -d "$Newname" ]; then
        cd "$Newname"
        echo -e "\n\nDiving into $Newname"
        rename_translit
        cd ../
    fi
done

Поиск копий файлов

Зависимость fdupes

Ищет копии файлов в указанных каталогов и заменяет на символические ссылки.

Code: dublazh
#!/bin/sh
fdupes -r <DIR1> [<DIR2> ... <DIRn>] | while read line; do
      if [ -z "$line" ]; then
        src=
      elif [ -z "$src" ]; then
        src="$line"
      else
        ln -s -f "$src" "$line"
      fi
    done

Скрипт оптимизации размера многостраничных PDF документов

Часто возникает ситуация, когда исходный многостраничный PDF документ имеет размер гораздо больше, чем составляющие его страницы. Например со сканера приходят документы в формате .tiff или .jpg - они конвертируются в формат .pdf с одновременным сшиванием их в один документ.
Оптимально будет в таком случае - каждую картинку перегнать в отдельный .pdf файл, а затем собрать их вместе. Но что делать, если у вас уже готовый многостраничный файл?
В большинстве случаев помогает следующий скрипт (но не всегда; встречаются случаи когда документ PDF уже до вас грамотно подготовлен):

Code: pdf-rebuild.sh
#!/bin/bash
#
#  Поместите свой многостраничный PDF файл в необходимую директорию (папку).
#  Поместите туда же данный скрипт. В свойствах скрипта проверте чтобы он был исполняемым.
#  Кликнете по нему мышкой (или в консоли выполните sh ConvertMinPDF.sh ) - выберите > запустить. 
#
#
#    Разбиваем наш многостраничный документ на отдельные страницы.
#
for pdfview in *.pdf
  do pdftk "$pdfview" burst output Page%04d.pdf
    #    Сшиваем обратно странички с грамотной экономией.
    #    Название вышедшего документа равно старому с приставкой New_
    gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="New_$pdfview"  Page*.pdf
    #
    #   Удаляем разрозненные страницы.
    #
    for pages in Page*.pdf
     do rm -f $pages
    done
    #
    #  Удаляем логи.
    #
    for hlamTXT in *.txt
     do rm -f $hlamTXT
    done
    #
done
exit

Источник

Подключение VNC-сервера к запущенной версии X-ов

Code: x11vnc-start.sh
#!/bin/bash
PARAM=( $0 $1 $2 $3 $4 $5 $6 )
for i in 1 3 5
    do
        case ${PARAM[$i]} in
            "--port"|"-p")
                VNCPORT="${PARAM[$i+1]}"
                ;;
            "--user"|"-u")
                 VNCUSER="${PARAM[$i+1]}"
                ;;
            "--displey"|"-d")
                 VNCDISPLEY="${PARAM[$i+1]}"
                ;;
            *)
                echo ${PARAM[$i]}
                if [ "${PARAM[$i]}" != "" ]
                    then
                        echo "Error in settings."
                        exit 1
                fi
            ;;
        esac
    done
if [ "$VNCPORT" == "" ]
    then
        VNCPORT="5900"
fi
if [ "$VNCUSER" == "" ]
    then
        VNCUSER=$(whoami)
fi
if [ "$VNCDISPLEY" == "" ]
    then
        VNCDISPLEY="0"
fi
if [ ! -f "/home/$VNCUSER/.vnc/passwd" ]
     then
        CURDIR=$PWD
        mkdir -p "/home/$VNCUSER/.vnc/"
        cd "/home/$VNCUSER/.vnc/" && x11vnc -storepasswd
        cd $CURDIR
fi

VNCAUTHFILE=$(ps wwwwaux | grep auth | grep /etc/X11/X | awk -F' ' '{print $17}')
x11vnc -dontdisconnect -display :$VNCDISPLEY -auth $VNCAUTHFILE -notruecolor -noxfixes -shared \
-forever -rfbport $VNCPORT -bg -rfbauth /home/$VNCUSER/.vnc/passwd

exit 0

где $1, $3, $5 могут быть "--user" или "-u", "--port" или "-p", "--displey" или "-d", а $2, $4, $6 соответственно их значения. Порядок параметров значения не имеет. Значения по умолчанию: текущий пользователь, 5900 порт, дисплей 0.

Скрипт нужно запускать от имени того пользователя, от которого запущен сеанс X-ов, обычно это рут.

Должен быть установлен пакет x11vnc.

Вывод размера всех файлов и подкаталогов в текущем каталоге

Данная команда выводит размер всех файлов и подкаталогов, сортирует их по размеру от большего к меньшему

Code:
ls -1 | while read line; do du -h -s "$line"; done | sort -h | tac

Вывод количества строк кода программы и размер его в байтах

Данная команда выводит количество строк кода в проекте Qt размер кода в байтах

Code:
find . -type f -name "*.pro" -or -name "*.cpp" -or -name "*.h" | while read file; do cat $file; done | wc -lc

Скрипт для создания снапшотов на разделах BTRFS

Нужно исправить соообщения об ошибках при выходе и написать справку.

Code: BTRFS snapshot creator
l#!/bin/bash

j=0
for i in $@
    do
        INPAR[$j]=$i
        let "j = j + 1"
    done
SFLD=0
i=0
while [ "$i" -lt "${#INPAR[@]}" ]
do
    case ${INPAR[$i]} in
        "-p"|"--mount-point")
                MP_PATH=${INPAR[$i+1]}
                ;;
        "-v"|"--sv"|"--subvolune")
                SUBVOLUNE=${INPAR[$i+1]}
                ;;
        "-d"|"--sf"|"--snapshots-folder")
                SNAPSHOTHSFOLDER=${INPAR[$i+1]}
                ;;
        "-n"|"--sn"|"--name")
                SNAME=${INPAR[$i+1]}
                ;;
        "-x"|"--sx"|"--suffix")
                SFX=${INPAR[$i+1]}
                ;;
        "-s"|"--sf"|"--subfolder")
                SFLD=1
                ;;
        "-h"|"--help")
                echo -e "Usage" $0 "[OPTIONS]\n\nOptions:\n"
                exit 1
                ;;
    esac
    let "i = i + 1"
done

if [ "$SUBVOLUME" == "" ] || [ "$MP_PATH" == "" ]
    then
        SYSPATH=$(cat /etc/fstab | grep " / ")
        if [ "$(echo $SYSPATH | awk -F' ' '{print $3}')" == "btrfs" ]
            then 
                if [ "$SUBVOLUME" == "" ]
                    then 
                        SUBVOLUME=$(echo $SYSPATH | awk -F' ' '{print $4}' | awk -F'subvol=' '{print $2}' | \
                              awk -F',' '{print $1}')
                fi
                if [ "$MP_PATH" == "" ]
                    then
                        VP=$(echo $SYSPATH | awk -F' ' '{print $1}')
                        MP_PATH=$(cat /etc/fstab | grep $VP | grep -v "subvol" | awk -F' ' '{print $2}')
                fi
                if [ "$MP_PATH" == "" ]
                    then
                        echo -e "Error!\nMopunt point  has not been set."
                        exit 2
                fi
                if [ "$SUBVOLUME" == "" ]
                    then
                        echo -e "Error!\nSubvolume has not been set."
                        exit 3
                fi
            else
                echo -e "Error!\nMount point has not been set and default mount point is not a btrfs."
                exit 4
        fi
fi

if [ "$SNAPSHOTSFOLDER" == "" ]
    then 
        SNAPSHOTSFOLDER="Snapshots"
fi

if [ "$SFX" == "" ]
    then 
        SFX="$(date +%Y:%m:%d-%H:%M:%S)"
fi

if [ "$SNAME" == "" ]
    then 
        SNAME=$SUBVOLUME
fi

if [ "$SFLD" == 0 ]
    then 
        SNAME=$SNAME"_"$SFX
    else
        SNAME=$SNAME"/"$SFX
fi

WASMOUNT=0
if [ "$(mount | grep $MP_PATH" ")" == "" ]
    then
        MP=$(cat /etc/fstab | grep $MP_PATH" " )
        if [ "$MP" != "" ]
            then
                if [ "$(echo $MP | awk -F' ' '{print $3}')" == "btrfs" ]
                    then
                        mount $MP_PATH
                        WASMOUNT=1
                    else
                        echo -e "Error!\nMmount point is not a btrfs."
                        exit 5
                fi
            else
                echo -e "Error!\nFolder is not mounted, and mount point is not exist in fstab."
                exit 6
        fi
    else
        if [ "$(mount | grep $MP_PATH" " | awk -F' ' '{print $5}')" != "btrfs" ]
            then
                echo -e "Error!\nMmount point is not a btrfs."
                exit 7
        fi
fi

mkdir -p $MP_PATH/$SNAPSOTSFOLDER
#echo "btrfs subvolume snapshot" $MP_PATH/$SUBVOLUME  $MP_PATH/$SNAPSHOTSFOLDER/$SNAME
btrfs subvolume snapshot $MP_PATH/$SUBVOLUME  $MP_PATH/$SNAPSHOTSFOLDER/$SNAME

if [ "$WASMOUNT" == "1" ]
    then
        umount $MP_PATH
fi

exit 0

Ключи:

  • -p - задает каталог в который примонтирован раздел с BTRFS со всеми подтомами (без ключа "subvol") Если параметр не задан, то будет искать в fstab системный раздел дополнительно монтирующийся без параметра subvol.
  • -v - задает подтом, который нужно будет снапшотить. По умолчанию - системный подтом.
  • -d - каталог на том же разделе, в который будет создан снапшот.
  • -n - имя снапшота, по умолчанию совпадает с именем подтома.
  • -x - суффикс имени. По умолчанию текущая дата.
  • -s - тогда имя будет определять подкаталог каталога со снапшотами, а суффикс - имя снапшота.

Распаковка и запаковка обратно файлов типов: ODF, EPUB, OO XML и т.д.

Файлы типов ODF, OO XML, EPUB и многие другие представляют из себя zip-архив. с несжатой информацией о MIME-типе файла.

Для примера для примера будет взят файл file.odt в домашнем каталоге.

Распаковка

Файл будет распакован в каталог MyDir

Code:
unzip ~/file.odt -d MyDir

Упаковка

Файл будет упакован в newfile.odt, который будет находиться в домашнем каталоге.

Code:
cd MyDir
zip -X ~/newfile.odt mimetype
zip -rg ~/newfile.odt * -x mimetype