sh/bash/dash/ksh/zsh等Shell脚本
-
xeoc
- 帖子: 1994
- 注册时间: 2007-05-06 10:12
#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
- 来自: 长沙
#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
- 来自: 杭州
-
联系:
#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
-
xeoc
- 帖子: 1994
- 注册时间: 2007-05-06 10:12
#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
#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
- 来自: 成都
-
联系:
#6
帖子
由 xiooli » 2008-12-12 22:48
文件名里面有点就腰斩掉了
-
xeoc
- 帖子: 1994
- 注册时间: 2007-05-06 10:12
#7
帖子
由 xeoc » 2008-12-12 22:57
xiooli 写了:文件名里面有点就腰斩掉了
所以我又加了个case
tar.gz这样的去掉两个,rar这样的去掉一个,我试过了,完美啊....
-
xeoc
- 帖子: 1994
- 注册时间: 2007-05-06 10:12
#8
帖子
由 xeoc » 2008-12-28 23:25
xiooli 写了:文件名里面有点就腰斩掉了
今天才发现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
#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
#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
#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
-
联系:
#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
-
tusooa
- 帖子: 6548
- 注册时间: 2008-10-31 22:12
- 系统: 践兔
-
联系:
#15
帖子
由 tusooa » 2010-02-16 19:21
xeoc 写了:xiooli 写了:文件名里面有点就腰斩掉了
今天才发现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,$@ 最好加双引号