[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Сценарий для распаковки



Из предыдущей темы вылез сценарий, который как ни странно, показался кому-то полезным.

Я занялся и обнаружил ещё пару утилит в репозитории: unp и atool.
Поскольку, по сравнению с первым у меня было кое-что, чего там не было,
а по сравнению со вторым было много больше, я решил его не выбрасывать
а попробовать доделать.

Что хочу:
1. Нормальное определение типа архива.
Как заметил Иван Лох:
"Если на клетке слона написано буйвол... file как-то кошернее и надежнее"

Но есть деталь: если архив составной (tar.gz, например), то вероятно нельзя определить,
что внутри, не зная названия.
Думаю, что file будет основным, а затем должно происходить уточнение по имени файла.
Кто посоветует правильней?

2. Минус всех сценариев - низкая модульность и настраиваемость.
Хочу сделать плагины.
Нужно ли?

3. Наверное, в связи с этим, стоит переписать сценарий на что-то
более вразумительное, чем shell?

4. Очень бы хотелось получить архивы экзотических форматов (типа ACE),
если кто-то может сделать с файликом test.txt внутри
и содержимым "test archive packer".

5. Чтобы ещё полезного добавить?


Это черновой вариант (надеюсь сделать скрипт к следующей неделе):

#
# Unpack archives. Functions by `muhas` modified by Artiom N..
#

# Used tools: unp, atool.

# TODO:
# ppmd
# munpack
# +unzoo
# uudecode
# rzip.
# iso.
# orange.
# pbzip
# pigz

alias x=unpack


# Распаковка любого архива (http://muhas.ru/?p=55)
unpack()
{
   if [ $# -lt 1 ]; then
      echo "Usage: unpack <file> [args]" >&2
      return 1
   fi

   e_exists()
   {
      which "$1" 2>&1 > /dev/null
   }


   a_name="$1"
   lower_name="$(echo "$1" | tr A-Z a-z)"
   extract_dir="$( echo $(basename "$a_name") | sed "s/\.${1##*.}//g" )"
   shift




   if [ -r "$a_name" ] ; then
      case "$lower_name" in
         *.tar.bz2|*.tbz|*.tbz2)    tar xvjf          "$a_name" $*      ;;
         *.tar.gz|*.tgz)            tar xvzf          "$a_name" $*      ;;
         *.tar.xz)                  tar --xz -xvf     "$a_name" $*      ;;
         *.tar.zma|*.tlz|*.tlzma)   tar --lzma -xvf   "$a_name" $*      ;;
         *.tar.lzop|*.tzo)          tar --lzop -xvf   "$a_name" $*      ;;
         *.tar.lzip)                tar --lzip -xvf   "$a_name" $*      ;;
         *.bz2|*.mar)               bunzip2           "$a_name" $*      ;;
         *.cab)                     cabextract -d "$extract_dir" "$a_name" ;;
         *.rar)                     unrar x           "$a_name" $*      ;;
         *.gz)                      gunzip            "$a_name" $*      ;;
         *.tar)                     tar xvf           "$a_name" $*      ;;
         *.zip)                     unzip             "$a_name" $*      ;;
         *.z)                       uncompress        "$a_name" $*      ;;
         *.7z|*.s7z)                7za x             "$a_name" $*      ;;
         *.rar)                     unrar x           "$a_name" $*      ;;
         *.xz)                      unxz              "$a_name" $*      ;;
         *.arj)                     arj x             "$a_name" $*      ;;
         *.ace|*.lzx)               unace x           "$a_name" $*      ;;
         *.lzm|*.lzma)              unlzma            "$a_name" $*      ;;
         *.lha)                     lha xv            "$a_name" $*      ;;
         *.lrz)                     lrunzip           "$a_name" $*      ;;
         *.lz)                      if e_exists plzip; then
                                       plzip -d       "$a_name" $*
                                    elif e_exists lzip; then
                                       lzip  -d       "$a_name" $*
                                    fi
                                                                        ;;
         *.lzo)                     lzop -dv          "$a_name" $*      ;;
         *.ha)                      ha x              "$a_name" $*      ;;
         *.kgb)                     kgb               "$a_name" $*      ;;
         *.ar)                      command ar vx     "$a_name" $*      ;;
         *.cpio|*.afio)             cpio -idv $* <    "$a_name"         ;;
         *.zpaq)                    if e_exists zp; then
                                       zp x "$a_name" "$*"
                                    elif e_exists zpaq; then
                                       zpaq x "$a_name" $*
                                    fi                                  ;;
         *.iss)                     innoextract -L -e "$a_name"         ;;
         *.msi)                     unshield -D 2 -v -o -L -d "$extract_dir" x "$a_name" ;;
         *.exe)                     echo "innoextract, orange or unshield" ;;
         *.zoo)                     zoo -x            "$a_name" $*      ;;
         *.tnef|*.dat)              tnef -v -C "$extract_dir" "$a_name" ;;
         *.chm)                     if e_exists archmage; then
                                       archmage "$a_name" "$extract_dir"
                                    elif e_exists extract_chmlib; then
                                       extract_chmlib "$a_name"
                                    fi
                                                                        ;;
         *.shar|shell.*archive)     [ ! -e "$extratc_dir" ] && mkdir -p "$extract_dir"
                                    unshar -f -d "$extract_dir" "$a_name"
                                                                        ;;
         *.adf)                     unadf -d "$extract_dir" "$a_name"   ;;
         *.dms)                     xdms -v -x "$a_name"                ;;
         *.jar|*.war|*.apk|*.j)     jar -xvf "$a_name"                  ;; # or zip, unpack200.
         *.alz)                     unalz -d "$extract_dir" "$a_name"   ;;
         *.arc|*.ark|*.sue)         nomarch -v "$a_name"                ;;
         *.sea|*.sea.bin)           macunpack "$a_name"                 ;;
         *.hqx)                     hexbin -v "$a_name"                 ;;
         *.dmg)                     7za x "$a_name"                     ;; # or dmg2img.
         *.deb)
                                    mkdir -p "$extract_dir/control"
                                    mkdir -p "$extract_dir/data"
                                    cd "$extract_dir"
                                    command ar vx "../${a_name}" > /dev/null
                                    cd control; tar xzvf ../control.tar.gz
                                    cd ../data; tar xzvf ../data.tar.gz
                                    cd ..; rm *.tar.gz debian-binary
                                    cd ..
                                                                        ;;
         *.rpm)                     mkdir "$extract_dir"
                                    cd "$extract_dir"
	                                 rpm2cpio "../${a_name}"|cpio -idumv $*
                                    cd ..
                                                                        ;;
         *)                 echo "Cannot unpack '$a_name' $*..."        ;;
      esac
   else
      echo "'$a_name' is not a valid file"
   fi
}

# ... и упаковка (http://muhas.ru/?p=55)
pack()
{
   if [ $1 ] ; then
      case $1 in
         tbz)     tar cjvf $2.tar.bz2     $2                      ;;
         tgz)     tar czvf $2.tar.gz      $2                      ;;
         tar)     tar cpvf $2.tar         $2                      ;;
         bz2)     bzip2 -c --best -v      $2 > $2.bz2             ;;
         gz)      gzip -c -9 --best -n -v $2 > $2.gz              ;;
         zip)     zip -r $2.zip           $2                      ;;
         7z)      7z a $2.7z              $2                      ;;
         rar)     rar a $2.rar            $2                      ;;
         *)       echo "'$2' Cannot be packed via pack()"         ;;
      esac
   else
      echo "'$2' is not a valid file"
   fi
}


Reply to: