bash против shs

Автор pa_, 16 февраля 2013, 16:42:18

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

pa_

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

отзывы, замечания и предложения в режиме беседы
В Windows пользователи "умудряются" создать файлы формата shs.
Обычно такие файлы содержат Word\Excel документы.
Но иногда попадаются и вирусы =), поэтому, на сколько мне объяснили здесь http://community.i-rs.ru/index.php/topic,15157.0.html , что это очень опасно если не знаешь какой программой "создан" файл shs, в Linux это не актуально =)
Здесь http://community.i-rs.ru/index.php/topic,17032.0.html человек попытался написать такую программу, но на момент написания скрипта, ее функционал был не полный.

Скрипт хорошо сдобрен комментариями на русском, так что легко можно разобраться как он работает.
Если забредет сюда пользователь Windows то в cygwin (http://www.cygwin.com/) тоже работает.


#!/bin/bash
# shs -> rtf, xls, docx, xlsx
# ver. 2013-02-16
# ver. 2012-01-20
#  (c)PAVka

# абсолютный путь до 7zip
ZZ="/usr/bin/7z"

# проверяем, установлен ли пакет 7zip
if [ -f $ZZ ]
  then
    echo "7zip установлен, версия:"
    $ZZ | head -n3 | tail -n2
    echo ""
  else
    echo "установите архиватор 7zip"
    echo "debian: apt-get install p7zip-full"
    echo "и повторите попытку"
    echo ""
    exit 0
fi

# есть ли аргументы у запускаемого скрипта
if [ $# -lt 1 ]
then
   echo "файлы для обработки не заданы"
   echo "пример: 'shsConv.sh a.shs b.shs'"
   echo "         shsConv.sh *.shs"
   echo ""
   exit 0
fi

echo "--- начинаем конвертировать"
# начинаем обходить все аргументы
for FILE in $@
  do
    echo ""
    echo "обрабатываем файл $FILE"

    # если файл существует - обрабатываем, иначе пропускаем
    if [ -f $FILE ]
      then

        # начинаем смотреть что внутри файла
        # проверяем есть ли файл "Package"
        # это у нас будет или docx или xlsx
        if $ZZ l $FILE | grep -i "Package" &> /dev/null
          then
            echo "это файл созданный в MSO 2007 и выше"
            # создаем временную папку куда будем распаковывать
            mkdir ./temp
            # копируем обрабатываемый файл во временную папку
            cp $FILE ./temp
            # переходим во временную папку
            cd ./temp
            # распаковываем обрабатываемый файл без абсолютных путей
            # это значит что все файлы валятся в корень папки
            # чтобы потом рекурсивно не искать
            $ZZ e -y $FILE &> /dev/null

            # файл Package это обычный zip архив
            # ищем в нем папку с именем или word или worksheets
            # и соответственно переименовываем или docx или xlsx

            if $ZZ l Package | grep -i "word" &> /dev/null
              then
                echo "это файл docx"
                mv -f "Package" "$FILE.docx"
                cd ..
                cp -f ./temp/$FILE.docx $FILE.docx
                рм -рф ./temp
                continue
            fi

            if $ZZ l Package | grep -i "worksheets" &> /dev/null
              then
                echo "это файл xlsx"
                mv -f "Package" "$FILE.xlsx"
                cd ..
                cp -f ./temp/$FILE.xlsx $FILE.xlsx
                рм -рф ./temp
                continue
            fi

            continue
          else
            echo "это не docx и не xlsx"
        fi

        # проверяем есть ли у нас файл "Rich Text Format"
        # это у нас будет rtf
        if $ZZ l $FILE | grep -i "Rich Text Format" &> /dev/null
          then
            echo "это файл rtf"
            # создаем временную папку куда будем распаковывать
            mkdir ./temp
            # копируем обрабатываемый файл во временную папку
            cp $FILE ./temp
            # переходим во временную папку
            cd ./temp
            # распаковываем обрабатываемый файл без абсолютных путей
            # это значит что все файлы валятся в корень папки
            # чтобы потом рекурсивно не искать
            $ZZ e -y $FILE &> /dev/null
            # ищем файл с именем "Rich Text Format"
            # переименовываем его
            mv -f "`find . -name "*Rich Text Format*"`" "$FILE.r"
            # необходимо почистить файл, удалив 4 байта в начале и сохранить
            # не всегда первые 4 байта являются непечатными символами, tr не подходит
            tail -c +5 $FILE.r > $FILE.rt
            # удалим все непечатные символы
            # по личным ощущениям после этого файл открывается быстрее
            #cat $FILE.rt | tr -d [:cntrl:] > $FILE.rtf
            # переходим на каталог выше
            cd ..
            # копируем в него получившейся файл из папки ./temp
            cp -f ./temp/$FILE.rt $FILE.rtf
            # удаляем временную папку
            рм -рф ./temp
            continue
          else
            echo "это не rtf"
        fi

        # проверяем есть ли у нас файл "Workbook"
        # это у нас будет xls
        if $ZZ l $FILE | grep -i "Workbook" &> /dev/null
          then
            echo "это файл xls"
            # создаем временную папку куда будем распаковывать
            mkdir ./temp
            # копируем обрабатываемый файл во временную папку
            cp $FILE ./temp
            # переходим во временную папку
            cd ./temp
            # распаковываем обрабатываемый файл без абсолютных путей
            # это значит что все файлы валятся в корень папки
            # чтобы потом рекурсивно не искать
            $ZZ e -y $FILE &> /dev/null
            # ищем файл с именем "Workbook"
            # переименовываем его
            mv -f "`find . -name "*Workbook*"`" "$FILE.xls"
            # переходим на каталог выше
            cd ..
            # копируем в него получившейся файл из папки ./temp
            cp -f ./temp/$FILE.xls $FILE.xls
            # удаляем временную папку
            рм -рф ./temp
            continue
          else
            echo "это не xls"
        fi

      else
        echo "не могу найти $FILE, пропускаем"
        continue
    fi
  done
echo ""
echo "--- конвертация закончена"
exit 0


Сам скрипт + файлы для примера по работа скрипта