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

Re: Особенности Zsh



> # Распаковка любого архива (http://muhas.ru/?p=55)
> unpack()
> {
>    if [ $# -lt 1 ]; then
>       echo "Usage: unpack <file> [args]" >&2
>       return 1
>    fi
> 
>    a_name="$1"
>    extract_dir="$( echo $(basename "$a_name") | sed "s/\.${1##*.}//g" )"
> 
>    shift
> 
>    if [ -f $1 ] ; then
>       case $1 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)           tar --lzma -xvf   "$a_name" $*      ;;
>          *.bz2)                     bunzip2           "$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)                      7za x             "$a_name" $*      ;;
>          *.rar)                     unrar x           "$a_name" $*      ;;
>          *.xz)                      unxz              "$a_name" $*      ;;
>          *.arj)                     arj x             "$a_name" $*      ;;
>          *.ace)                     unace x           "$a_name" $*      ;;
>          *.lzm,*.lzma)              unlzma            "$a_name" $*      ;;
>          *.deb)
>                                     mkdir -p "$extract_dir/control"
>                                     mkdir -p "$extract_dir/data"
>                                     cd "$extract_dir"; ar vx "../${1}" > /dev/null
>                                     cd control; tar xzvf ../control.tar.gz
>                                     cd ../data; tar xzvf ../data.tar.gz
>                                     cd ..; rm *.tar.gz debian-binary
>                                     cd ..
>                                                                         ;;
>          *.ar)                      ar x              "$a_name" $*      ;;
>          *.cpio,*.rpm)              cpio -i $* <      "$a_name"         ;;
>          *)                 echo "Cannot unpack '$a_name' $*..."        ;;
>       esac
>    else
>       echo "'$1' 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)     bzip                 $2                      ;;
>          gz)      gzip -c -9 --best -n $2 > $2.gz              ;;
>          zip)     zip -r $2.zip        $2                      ;;
>          7z)      7z a $2.7z           $2                      ;;
>          rar)     rar a $2.rar         $2                      ;;
>          *)       echo "'$1' Cannot be packed via pack()"      ;;
>       esac
>    else
>       echo "'$1' is not a valid file"
>    fi
> }

Видел эти функции, не знаю где они изначально появились, когда ковырялся в арче
спер конфиг у какого-то хакера арче, вроде бы codemac, но точно не помню, были
и куски кода phrakture (Aaron Griffin).

Функции крутые, но в свое время отказался от них, чтобы не забывать команд, не
везде есть свой .bashrc/.zshrc под рукой, и потому по памяти можно набирать
unpack/pack, но вывод будет:

--
-bash: unpack: command not found
--

Кстати pack функция изначально называлась _roll_, только что глянул свой
.bashrc, там так и осталась она.


А вот то, что у меня в .zsh/functions лежит еще:
(кстати синтаксис рабочий только в zsh)

--
unpack()
{
    local old_dirs current_dirs lower
    lower=${(L)1}
    old_dirs=( *(N/) )
    if [[ $lower == *.tar.gz || $lower == *.tgz ]]; then
        tar xvzf $1
    elif [[ $lower == *.gz ]]; then
        gunzip $1
    elif [[ $lower == *.tar.bz2 || $lower == *.tbz ]]; then
        tar xvjf $1
    elif [[ $lower == *.bz2 ]]; then
        bunzip2 $1
    elif [[ $lower == *.zip ]]; then
        unzip $1
    elif [[ $lower == *.rar ]]; then
        unrar e $1
    elif [[ $lower == *.tar ]]; then
        tar xvf $1
    elif [[ $lower == *.lha ]]; then
        lha e $1
    else
        print "Unknown archive type: $1"
        return 1
    fi
    # Change in to the newly created directory, and
    # list the directory contents, if there is one.
    current_dirs=( *(N/) )
    for i in {1..${#current_dirs}}; do
        if [[ $current_dirs[$i] != $old_dirs[$i] ]]; then
            cd $current_dirs[$i]
            break
        fi
    done
}

это и для баша и для zsh идентично
roll()
{
    FILE=$1
    case $FILE in
        *.tar.bz2) shift && tar cjf $FILE $* ;;
        *.tar.gz) shift && tar czf $FILE $* ;;
        *.tgz) shift && tar czf $FILE $* ;;
        *.zip) shift && zip $FILE $* ;;
        *.rar) shift && rar $FILE $* ;;
    esac
}
--

-Ivan

Attachment: signature.asc
Description: Digital signature


Reply to: