Пользительные штуковины (собственного производства)

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

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

Пользительные штуковины

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

Набросал я сегодня маленький скриптец, посмотрел на него и подумал: "А ведь это и ещё кому кроме меня может сгодиться.." Значится так, преамбула: имеются у нас, скажем, несколько html-страничек, покиданных вместе с картинками, стилями и прчей лабудой в один каталог -- соответственно, очень хочется куда-то это несусветное количество файлов упрятать. Особенно хорошо оценят те, кто хоть раз нажимал в опере на "save with images". Я лично решил упрятывать в tar.bz2-архивы. Скрипт работает только в текущем каталоге, в двух вариантах: без параметров пакует все странички и всё, на что они ссылаются, в один архив с именем, равным имени текущего каталога; точно так же он поступит и с несколькими отдельными страницами, переданными в качестве нескольких параметров. С одним параметром -- именем html-ки -- оная пакуется со всеми причендалами в один архив с именем как у самой странички. Теперь, собственно, амбула:

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

#!/bin/bash
TMPNAME=`tempfile -p bzhtm`
if [ $# -eq 0 ]; then
  MASK='*.[hH][tT][mM]*'
else
  MASK=$@
fi
for i in $MASK; do
  echo `basename "$i"` >> $TMPNAME
  for j in *; do
      if [ -f "$j" ]; then
    grep -q "$j" "$i" && echo "$j" >>$TMPNAME
      fi
  done
done
if [ $# -eq 1 ]; then
  grep -vq "$1" $TMPNAME && tar chjT $TMPNAME --remove-files >"$1".tar.bz2
else
  DIRNAME=`pwd`
  sort $TMPNAME |uniq |tar chjT - --remove-files >`basename $DIRNAME`.tar.bz2
fi

basename в начале цикла нужно для того случая, когда скрипт вызывается из контекстного меню какого-нибудь крузейдера (на нём проверял) -- оттуда имя попадает с полным путём.
Скрипт, конечно, не лишён недостатков, основной из которых -- неумение в "общем" режиме пропускать файлы вида *.htm.*, которые он сам и генерит в "частном" режиме. Также отсутствует какая-либо защита от дурака. Я его переделывать больше не буду -- мне и так хватает. Если кто чего добавит/поправит или скажет мне, как можно написать покороче (я над этим особо не задумывался), -- буду очень благода. А так -- берите, пользуйтесь, кому надо, под GPL :)

P.S. Кста, если поменять в команде затаривания j на z (при этом рекомендуется установить $GZIP в "-9" для улучшения сжатия), а расширение поменять с tar.bz2 на не-помню-какое, должен получиться (не проверял) конкверорский файл "локально сохранённой страницы", который оным конкверором можно и открывать не распаковывая. На сей предмет меня просветил когда-то snake, за что ему отдельное человеческое спасибо.
P.P.S. И ещё кста, может, давайте такие штуки, которые могут ещё кому пригодиться, выкладывать на всеобщий суд? В этой теме.
P.P.P.S. К тому же это моё 2000-е сообщение :)
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Ni@m
Сообщения: 5

Re: Пользительные штуковины

Сообщение Ni@m »

У мен есть тоже полезный скрипт, коим я пользуюсь каждый день. А имеено, распаковывает архивы. Причем ему все равно, что за архив. Сам распознает. И количество архивов за раз - сколько угодно =). Если куда надо в другое место распаковать, так указать -d path. Единственное, что на с++ писал, что можно написать и на перле и на shell, просто я экпериментировал. это mtar, который говорит, какой тип архива имеем

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

#include <string.h>
#include <stdio.h>

int main(int args, char *argv[])
{
    if (args > 1)
    {
  if (strstr(argv[1],".tar") != NULL || strstr(argv[1],".tgz") != NULL || strstr(argv[1],".tbz") != NULL || strstr(argv[1],".rar") !=NULL || strstr(argv[1],".zip"))
  {
      if ( strstr(argv[1],"gz") != NULL)
      {
    printf("gz");
    return 0;
      }
      if ( strstr(argv[1],"bz") != NULL)
      {
    printf("bz");
    return 0;
      }
      if ( strstr(argv[1],"zip") != NULL)
      {
    printf("zip");
    return 0;
      }
      if ( strstr(argv[1],"rar") != NULL)
      {
    printf("rar");
    return 0;
      }
      if ( strstr(argv[1],"gz") == NULL && strstr(argv[1],"bz") == NULL )
      {
    printf("tar");
    return 0;
      }
  }
  else
      printf("ntar");
    }
    return 0;
}

А вот и сам скрипт.

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

#!/bin/bash
if [ $# -eq 0 ]
then
    echo -e "\033[31mno arguments\033[0m"
    exit 1
fi
DIR=/tmp

set_dir()
{
while getopts d: arg
do
    case $arg in
  d)dir=$OPTARG;;
    esac
done

if [ -n $dir -a ! -d $dir ]
then
    echo -e "\033[31mdirectory to ectract is set current `pwd`"
    echo -e "because \033[36m'${dir}'\033[31m does not exists\033[0m"
    DIR=`pwd`
else
    DIR=$dir
fi

}


mu="dst"

for i in $@
do
    if [ $i = "-d" ]
    then
  set_dir $*
  mu="dirset"
  continue
    fi
    if [ $mu = "dirset" ]
    then
  mu="dst"
  continue
    fi
    a=`mtar $i`
    case $a in
  gz) tar -zxf $i --directory=$DIR;;
  bz) tar -jxf $i --directory=$DIR;;
  tar) tar -xf $i --directory=$DIR;;
  zip) unzip $i -d $DIR;;
  rar) unrar x $i $DIR;;
  ntar) echo -e "\033[36m'${i}' \033[31mnot a tar archive\033[0m";
    esac
done

Не претендую на оригинальность, но может кому-то поможет.
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Пользительные штуковины

Сообщение nercus »

А у меня очень похожая штука к роксу (ROX-Filer) прикручена:). Эффект - архивы открываются как папки (ну почти:)) в роксе:

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

#!/bin/sh

U_FTYPE="/usr/bin/file -i"
U_FILER="/usr/bin/rox"

ARCFILE="${1}"
ARCNAME="${ARCFILE##*/}"
ARCDEST="${HOME}/.tmp/${ARCNAME}"
ARCTYPE="$(${U_FTYPE} "${ARCFILE}")";ARCTYPE="${ARCTYPE##*/}"

prepare_dest() {
    mkdir -p "${1}"
    ${U_FILER} "${1}"
}

case "${ARCTYPE}" in
    x-gzip)
        prepare_dest "${ARCDEST}"
        tar xvzf "${ARCFILE}" -C "${ARCDEST}";;
    x-bzip2)
        prepare_dest "${ARCDEST}"
        tar xvjf "${ARCFILE}" -C "${ARCDEST}";;
    x-rar)
        prepare_dest "${ARCDEST}"
        unrar e "${ARCFILE}" "${ARCDEST}";;
    x-zip)
        prepare_dest "${ARCDEST}"
        unzip -d "${ARCDEST}" "${ARCFILE}";;
    *);;
esac
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали: