一个简单集合了几种压缩格式的脚本

sh/bash/dash/ksh/zsh等Shell脚本
回复
Onway
帖子: 26
注册时间: 2011-01-14 20:41
联系:

一个简单集合了几种压缩格式的脚本

#1

帖子 Onway » 2011-07-18 12:26

初学script,大牛见笑,求建议和指正

代码: 全选

#!/bin/bash
# this shell script comp.sh is for compresss , decompress and view
# usage:
#   comp -l target.xxx			list files in compress file
#   comp -c target.xxx file/dircetory...	compress file
#   comp -d target.xxx [path]		decompress file
#   comp -h,
# 	--help				view help
# it support rar,zip,gz,bz2,tar.gz,tar.bz2,and your target file must specify the suffix such as .rar
# 2011-7-18 by onway

function viewhelp()
{
	echo "\
usage:
  comp -l target.xxx			list files in compress file
  comp -c target.xxx file/dircetory...	compress files
  comp -d target.xxx [path]		decompress file
  comp -h,
	--help				view help
"
}
test $# -le 1 && viewhelp && exit 1

if [ "$( echo "$2" | grep ".rar$" )" != "" ] ; then
	filetype=".rar"
elif [ "$( echo "$2" | grep ".zip$" )" != "" ] ; then
	filetype=".zip"
elif [ "$( echo "$2" | grep ".tar.gz$" )" != "" ] ; then
	filetype=".tar.gz"
elif [ "$( echo "$2" | grep ".tar.bz2$" )" != "" ] ; then
	filetype=".tar.bz2"
elif [ "$( echo "$2" | grep ".gz$" )" != "" ] ; then
	filetype=".gz"
elif [ "$( echo "$2" | grep ".bz2$" )" != "" ] ; then
	filetype=".bz2"
elif [ "$( echo "$2" | grep ".tar$" )" != "" ] ; then
	filetype=".tar"
else
	echo "unknow file type" && exit 1
fi

if [ "$1" == "-c" -a $# -ge 3 ] ; then
	target="$2"
	shift 2
	case $filetype in
		".rar" )
			rar a -r $target $*
		;;
		".zip" )
			zip -r $target $*
		;;
		".gz" )
			gzip -cv $* > $target
		;;
		".bz2" )
			bzip2 -cv $* > $target
		;;
		".tar" )
			tar -cv -f $target $*
		;;
		".tar.gz" )
			tar -czv -f $target $*
		;;
		".tar.bz2" )
			tar -cjv -f $target $*
		;;
	esac

elif [ "$1" == "-l" -a $# -ge 2 ] ; then
	case $filetype in
		".rar" )
			rar v $2
		;;
		".zip" )
			unzip -l $2
		;;
		".gz" )
			echo $(basename $2 | cut -d '.' -f 1)
		;;
		".bz2" )
			echo $(basename $2 | cut -d '.' -f 1)
		;;
		".tar" )
			tar -t -f $2
		;;
		".tar.gz" )
			tar -tz -f $2
		;;
		".tar.bz2" )
			tar -tj -f $2
		;;
	esac

elif [ "$1" == "-d" -a $# -ge 2 ] ; then
	if [ $# -lt 3 ] ; then
		path="./"
	elif [ "$( echo "$3" | grep "/$" )" != "" ] ; then
		path="$3"
	else
		path="$3/"
	fi

	case $filetype in
		".rar" )
			rar x $2 $path
		;;
		".zip" )
			unzip $2 -d $path
		;;
		".gz" )
			path="$path$( basename $2 | cut -d '.' -f 1 )"
			gzip -dv -c -f $2 > $path
		;;
		".bz2" )
			path="$path$( basename $2 | cut -d '.' -f 1 )"
			bzip2 -dv -c -f $2 > $path
		;;
		".tar" )
			tar -xv -f $2 -C $path
		;;
		".tar.gz" )
			tar -xzv -f $2 -C $path
		;;
		".tar.bz2" )
			tar -xjv -f $2 -C $path
		;;
	esac

elif [ "$1" == "-h" -o "$1" == "--help" ] ; then
	viewhelp
else
	viewhelp
fi
exit 0
头像
nmsfan
帖子: 18958
注册时间: 2009-10-16 22:46
来自: finland

Re: 一个简单集合了几种压缩格式的脚本

#2

帖子 nmsfan » 2011-07-18 12:28

我的file-rollor挂掉了……
>>>>推Ubuntu 桌面培训~~<<<<
>>>>想加入/了解gimp汉化吗,点我吧~<<<<
——————————————————————
不推荐wubi,也不推荐你给别人推荐wubi…………
随心而为的感觉真好……
强推mayhem!!
强推ensiferum
Onway
帖子: 26
注册时间: 2011-01-14 20:41
联系:

Re: 一个简单集合了几种压缩格式的脚本

#3

帖子 Onway » 2011-07-18 12:36

我还没仔细用过那个界面的压缩工具呢
头像
adam8157
帖子: 2794
注册时间: 2009-03-05 16:31
联系:

Re: 一个简单集合了几种压缩格式的脚本

#4

帖子 adam8157 » 2011-07-18 12:43

https://github.com/adam8157/scripts/blob/master/extract

我的, 可以建立新文件夹然后解压, 以前还用各种unrar, lzma什么的, 后来除了tarball统一到7z了
Onway
帖子: 26
注册时间: 2011-01-14 20:41
联系:

Re: 一个简单集合了几种压缩格式的脚本

#5

帖子 Onway » 2011-07-18 20:03

7zip就先不加上去了,新建文件夹来解压,很好。
但我想脚本需要进行权限之类的判断吗?直接交给程序判断不就好了么?
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 一个简单集合了几种压缩格式的脚本

#6

帖子 eexpress » 2011-07-18 20:29

简单的这样,是可以的。
只是,其实文件类型都应该带判断的。
要使用mime-type。比如file -i那样的。

如果作软件用,就不要重复发明了。用file-roller最好。
● 鸣学
Onway
帖子: 26
注册时间: 2011-01-14 20:41
联系:

Re: 一个简单集合了几种压缩格式的脚本

#7

帖子 Onway » 2011-07-18 20:56

eexpress 写了:简单的这样,是可以的。
只是,其实文件类型都应该带判断的。
要使用mime-type。比如file -i那样的。

如果作软件用,就不要重复发明了。用file-roller最好。
“文件类型应该带判断“什么意思?
这个东西只是学习shell script之用。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 一个简单集合了几种压缩格式的脚本

#8

帖子 eexpress » 2011-07-18 20:59

● file -i paste-img_0.55_all.deb
paste-img_0.55_all.deb: application/octet-stream; charset=binary
2011-07-18 20:58:54 一 ~/bin/paste-img
● file paste-img_0.55_all.deb
paste-img_0.55_all.deb: Debian binary package (format 2.0)

比如这样,扩展名是不可靠的。
● 鸣学
头像
adam8157
帖子: 2794
注册时间: 2009-03-05 16:31
联系:

Re: 一个简单集合了几种压缩格式的脚本

#9

帖子 adam8157 » 2011-07-18 22:32

eexpress 写了:简单的这样,是可以的。
只是,其实文件类型都应该带判断的。
要使用mime-type。比如file -i那样的。

如果作软件用,就不要重复发明了。用file-roller最好。
file-roller依赖nautilus-data, 无法接受啊...

至于mime, 一般扩展名都还好啦
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: 一个简单集合了几种压缩格式的脚本

#10

帖子 tusooa » 2011-07-22 23:54

你那还用grep的,没必要啊.
倒可以把命令都些在array里,别case了,直接${array[xxx]}
可以用bash的hash.
https://github.com/tusooa/tusooa/blob/m ... 8E%8B.bash 这个只有解压的功能.

代码: 全选

] ls -ld //
Onway
帖子: 26
注册时间: 2011-01-14 20:41
联系:

Re: 一个简单集合了几种压缩格式的脚本

#11

帖子 Onway » 2011-07-24 14:14

eexpress 写了:简单的这样,是可以的。
只是,其实文件类型都应该带判断的。
要使用mime-type。比如file -i那样的。

如果作软件用,就不要重复发明了。用file-roller最好。
tusooa 写了:你那还用grep的,没必要啊.
倒可以把命令都些在array里,别case了,直接${array[xxx]}
可以用bash的hash.
https://github.com/tusooa/tusooa/blob/m ... 8E%8B.bash 这个只有解压的功能.
谢谢二牛指导!
没必要用grep,那怎么做?
头像
adam8157
帖子: 2794
注册时间: 2009-03-05 16:31
联系:

Re: 一个简单集合了几种压缩格式的脚本

#12

帖子 adam8157 » 2011-07-24 20:58

Onway 写了:
eexpress 写了:简单的这样,是可以的。
只是,其实文件类型都应该带判断的。
要使用mime-type。比如file -i那样的。

如果作软件用,就不要重复发明了。用file-roller最好。
tusooa 写了:你那还用grep的,没必要啊.
倒可以把命令都些在array里,别case了,直接${array[xxx]}
可以用bash的hash.
https://github.com/tusooa/tusooa/blob/m ... 8E%8B.bash 这个只有解压的功能.
谢谢二牛指导!
没必要用grep,那怎么做?
你都没看我和tusooa给的脚本么? 我俩没用grep...直接取扩展名
Onway
帖子: 26
注册时间: 2011-01-14 20:41
联系:

Re: 一个简单集合了几种压缩格式的脚本

#13

帖子 Onway » 2011-07-29 9:52

*.tar.gz
*.zip
明白了
Onway
帖子: 26
注册时间: 2011-01-14 20:41
联系:

Re: 一个简单集合了几种压缩格式的脚本

#14

帖子 Onway » 2011-08-05 17:34

tusooa建议不用grep,但我真不知道怎么取到扩展名,adam8157说的直接取扩展名只是在case语句里使用了通配符'*'而已,这实现不了tusooa说的命令数组:${array[xxx]}.
而且就算能取到扩展名如'.tar.gz',但是数组的下标变量似乎不支持'.'的出现,即${array[.tar.gz]是不行的
最后,由于不是所有命令的具有统一的形式(或许能写成统一),比如bz2和gz后缀的,需要用到数据重定向符号,并且都不只有一个命令语句,使用数组写出来虽然代码短了,但感觉更糟糕了(也许只是个人能力问题@_@)
回复