帮忙改一下rox的解压缩脚本

sh/bash/dash/ksh/zsh等Shell脚本
xeoc
帖子: 1994
注册时间: 2007-05-06 10:12

帮忙改一下rox的解压缩脚本

#1

帖子 xeoc » 2008-12-12 12:40

代码: 全选

#!/bin/sh

filename="$@"
bname=$(basename "$filename")
dname=$(dirname "$filename")
destdir=${bname}.FILES

[ -w "$dname" ]  || dname=${HOME}

if [ ! -d "$destdir" ]; then
    cd "$dname"
    mkdir "$destdir"
    cd "$destdir"

    case "$bname" in
        *.rar ) rar e "$filename" ;;
        *.tar.gz | *.tgz) tar -xvzf "$filename" ;;
        *.tar.bz2 ) tar -xvjf "$filename" ;;
        *.tar ) tar -xvf "$filename" ;;
        *.gz ) gzip -d "$filename" ;;
        *.bz2 | *.bzip2 ) bzip2 -d "$filename" ;;
        *.zip ) unzip "$filename" ;;
        *.deb) ar x "$filename" ;;
        * ) ;;
    esac
fi
解压后会带上原来的扩展名..1.tar.gz解压到了1.tar.gz.FILES,能不能解压到1...

理论上destdir=${bname}.FILES改成用sed正则匹配去掉扩展名,但是,我没鼓捣出来
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 帮忙改一下rox的解压缩脚本

#2

帖子 eexpress » 2008-12-12 12:48

☎ cat 解压到这里
#!/bin/bash

#file-roller -h $*
file-roller --extract-to="""$*.FILES""" --force """$*"""
● 鸣学
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

Re: 帮忙改一下rox的解压缩脚本

#3

帖子 bones7456 » 2008-12-12 14:01

代码: 全选

lily@LLY:~$ t=a.b.c.d
lily@LLY:~$ echo $t
a.b.c.d
lily@LLY:~$ echo ${t%.*}.FILES
a.b.c.FILES
lily@LLY:~$ echo ${t%%.*}.FILES
a.FILES
关注我的blog: ε==3
xeoc
帖子: 1994
注册时间: 2007-05-06 10:12

Re: 帮忙改一下rox的解压缩脚本

#4

帖子 xeoc » 2008-12-12 22:16

bones7456 写了:

代码: 全选

lily@LLY:~$ t=a.b.c.d
lily@LLY:~$ echo $t
a.b.c.d
lily@LLY:~$ echo ${t%.*}.FILES
a.b.c.FILES
lily@LLY:~$ echo ${t%%.*}.FILES
a.FILES
太棒了...
xeoc
帖子: 1994
注册时间: 2007-05-06 10:12

Re: 帮忙改一下rox的解压缩脚本

#5

帖子 xeoc » 2008-12-12 22:39

代码: 全选

#!/bin/sh

filename="$@"
bname=$(basename "$filename")
dname=$(dirname "$filename")
destdir=${bname%.*}
case "$bname" in
        *.tar.gz | *.tar.bz2 ) destdir=${bname%%.*} ;;
esac

[ -w "$dname" ]  || dname=${HOME}

if [ ! -d "$destdir" ]; then
    cd "$dname"
    mkdir "$destdir"
    cd "$destdir"

    case "$bname" in
        *.rar ) rar e "$filename" ;;
        *.tar.gz | *.tgz) tar -xvzf "$filename" ;;
        *.tar.bz2 ) tar -xvjf "$filename" ;;
        *.tar ) tar -xvf "$filename" ;;
        *.gz ) gzip -d "$filename" ;;
        *.bz2 | *.bzip2 ) bzip2 -d "$filename" ;;
        *.zip ) unzip "$filename" ;;
        *.deb) ar x "$filename" ;;
        * ) ;;
    esac
fi
完美啊 不用多装个file-roller了...
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

Re: 帮忙改一下rox的解压缩脚本

#6

帖子 xiooli » 2008-12-12 22:48

文件名里面有点就腰斩掉了 :em04
xeoc
帖子: 1994
注册时间: 2007-05-06 10:12

Re: 帮忙改一下rox的解压缩脚本

#7

帖子 xeoc » 2008-12-12 22:57

xiooli 写了:文件名里面有点就腰斩掉了 :em04
所以我又加了个case

tar.gz这样的去掉两个,rar这样的去掉一个,我试过了,完美啊....
xeoc
帖子: 1994
注册时间: 2007-05-06 10:12

Re: 帮忙改一下rox的解压缩脚本

#8

帖子 xeoc » 2008-12-28 23:25

xiooli 写了:文件名里面有点就腰斩掉了 :em04
今天才发现bug...多搞个变量,多去一遍好了

代码: 全选

#!/bin/sh

filename="$@"
bname=$(basename "$filename")
dname=$(dirname "$filename")
destdir1=${bname%.*}
destdir=${destdir1}

case "$bname" in
	*.tar.gz | *.tar.bz2 ) destdir=${destdir1%.*} ;;
esac

[ -w "$dname" ]  || dname=${HOME}

if [ ! -d "$destdir" ]; then
    cd "$dname"
    mkdir "$destdir"
    cd "$destdir"

    case "$bname" in
        *.tar.gz | *.tgz) tar xvzf "$filename" ;;
        *.tar.bz2 ) tar xvjf "$filename" ;;
        *.tar ) tar xvf "$filename" ;;
        *.gz ) gzip -d "$filename" ;;
        *.bz2 | *.bzip2 ) bzip2 -d "$filename" ;;
	*.deb) ar x "$filename" ;;
        *.zip ) unzip "$filename" ;;
        *.rar ) unrar e "$filename" ;;
	*.7z) 7zr e "$filename" ;;
        * ) ;;
    esac
fi
这次感觉应该没问题了
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 帮忙改一下rox的解压缩脚本

#9

帖子 aerofox » 2008-12-29 22:02

仍然有问题:
1. 一开始 filename="$@" 就有问题,如果用多个文件名调用脚本呢?
2. if [ ! -d "$destdir" ]; then 的逻辑有些怪,没有 else 语句,也就是说如果当前目录下存在一个叫 "$destdir" 的子目录,就什么也不做。
3. cd 之后再执行 tar 等命令,而后面的文件名参数没有转换路径,那么当要解压的文件不在当前目录下时,用相对路径来调用脚本时就会找不到文件了。
xeoc
帖子: 1994
注册时间: 2007-05-06 10:12

Re: 帮忙改一下rox的解压缩脚本

#10

帖子 xeoc » 2008-12-29 22:48

aerofox 写了:仍然有问题:
1. 一开始 filename="$@" 就有问题,如果用多个文件名调用脚本呢?
2. if [ ! -d "$destdir" ]; then 的逻辑有些怪,没有 else 语句,也就是说如果当前目录下存在一个叫 "$destdir" 的子目录,就什么也不做。
3. cd 之后再执行 tar 等命令,而后面的文件名参数没有转换路径,那么当要解压的文件不在当前目录下时,用相对路径来调用脚本时就会找不到文件了。
因为是rox用的,1和3不存在,shell用的嘛,alias的解压就挺好...

要是能够实现,如果压缩包里只有一个文件夹就不要新建文件夹直接解压就好了
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 帮忙改一下rox的解压缩脚本

#11

帖子 aerofox » 2008-12-29 23:07

我没用过 rox,不知道它会不会带多个文件调用脚本,LZ 确认它不会就好了。不过这样的话,我还是建议把 "$@" 改为 "$1",虽然效果是一样的,但含义更明确。
第 2 个问题你再好好想想,改改就行了。
楼上提出的新问题,可以先列一下内容(比如 tar tvf "$filename"),并且看看是不是都以一个目录名开头(要考虑由 tar cvf file.tar . 生成的包中的例外情况)。这样做就是有点耗费时间。另一个做法是,先不管三七二十一,按你原来的思路,都解开到独立的目录下,然后再看这个目录下如果只存在一个子目录,不含其它文件和目录项,就把它移到上一级目录中,并把原来创建的子目录删除。
头像
adam8157
帖子: 2794
注册时间: 2009-03-05 16:31
联系:

Re: 帮忙改一下rox的解压缩脚本

#12

帖子 adam8157 » 2010-02-04 20:46

当年年少无知啊...areofox针针见血...

又写了个新版本, 同时支持rox和shell, 主要是万一有密码就要用到xterm, rox的脚本当前目录为~....请大家指正....

代码: 全选

#!/bin/sh

case "$TERM" in
	xterm* | screen  ) head="" ;;
	* ) head="xterm -e" ;;
esac

for args in $@

do

fname=$(readlink -f "$args")
bname=$(basename "$fname")
dname=$(dirname "$fname")
dest1st=${bname%.*}
dest2nd=${dest1st%.*}
destdir=${dest1st}

case "$bname" in
	*.tar.gz | *.tar.bz2 ) destdir=${dest2nd} ;;
esac

if [ ! -w "$dname" ]; then

    $head "echo Permission denied && sleep 2"
    exit 1

elif [ -d "$dname/$destdir" ]; then

    $head "echo Directory already exists && sleep 2"
    exit 1

else

    cd "$dname"
    mkdir "$destdir"
    cd "$destdir"

    case "$bname" in
        *.tar.bz2 | *.tbz | *.tb2 | *.tbz2) $head tar xvjf "$fname" ;;
        *.tar.gz | *.tgz) $head tar xvzf "$fname" ;;
        * ) $head 7z x "$fname" ;;
    esac

fi

    cd "$dname"

done

exit 0
billbear
帖子: 3681
注册时间: 2008-05-03 23:42

Re: 帮忙改一下rox的解压缩脚本

#14

帖子 billbear » 2010-02-05 1:44

物是人非啦
当年的 rms
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: 帮忙改一下rox的解压缩脚本

#15

帖子 tusooa » 2010-02-16 19:21

xeoc 写了:
xiooli 写了:文件名里面有点就腰斩掉了 :em04
今天才发现bug...多搞个变量,多去一遍好了

代码: 全选

#!/bin/sh

filename="$@"
bname=$(basename "$filename")
dname=$(dirname "$filename")
destdir1=${bname%.*}
destdir=${destdir1}

case "$bname" in
	*.tar.gz | *.tar.bz2 ) destdir=${destdir1%.*} ;;
esac

[ -w "$dname" ]  || dname=${HOME}

if [ ! -d "$destdir" ]; then
    cd "$dname"
    mkdir "$destdir"
    cd "$destdir"

    case "$bname" in
        *.tar.gz | *.tgz) tar xvzf "$filename" ;;
        *.tar.bz2 ) tar xvjf "$filename" ;;
        *.tar ) tar xvf "$filename" ;;
        *.gz ) gzip -d "$filename" ;;
        *.bz2 | *.bzip2 ) bzip2 -d "$filename" ;;
	*.deb) ar x "$filename" ;;
        *.zip ) unzip "$filename" ;;
        *.rar ) unrar e "$filename" ;;
	*.7z) 7zr e "$filename" ;;
        * ) ;;
    esac
fi
这次感觉应该没问题了
大便包有自己的解压程式,dpkg-deb -x
当年年少无知啊...areofox针针见血...

又写了个新版本, 同时支持rox和shell, 主要是万一有密码就要用到xterm, rox的脚本当前目录为~....请大家指正....

代码: 全选

#!/bin/sh

case "$TERM" in
   xterm* | screen  ) head="" ;;
   * ) head="xterm -e" ;;
esac

for args in $@

do

fname=$(readlink -f "$args")
bname=$(basename "$fname")
dname=$(dirname "$fname")
dest1st=${bname%.*}
dest2nd=${dest1st%.*}
destdir=${dest1st}

case "$bname" in
   *.tar.gz | *.tar.bz2 ) destdir=${dest2nd} ;;
esac

if [ ! -w "$dname" ]; then

    $head "echo Permission denied && sleep 2"
    exit 1

elif [ -d "$dname/$destdir" ]; then

    $head "echo Directory already exists && sleep 2"
    exit 1

else

    cd "$dname"
    mkdir "$destdir"
    cd "$destdir"

    case "$bname" in
        *.tar.bz2 | *.tbz | *.tb2 | *.tbz2) $head tar xvjf "$fname" ;;
        *.tar.gz | *.tgz) $head tar xvzf "$fname" ;;
        * ) $head 7z x "$fname" ;;
    esac

fi

    cd "$dname"

done

exit 0
第一个case里头(line 4)设了head=""
然而,后面(line 25, line 30)采用了 $head "口口"方式调用
就是执行"口口",然而:

代码: 全选

>> bash -c 'foo="" ; $foo "echo foo ; sleep 1"'
bash: echo foo ; sleep 1:找不到命令
[tlcr: 127]
最好改成head='eval'

line 8,$@ 最好加双引号

代码: 全选

] ls -ld //
回复