linux纯脚本tar自解压程序实现
类似于windows的自解压程序,仅依赖tail tar gzip三个主命令!压缩后的文件为xxx.2,已经修改过几次bug。话不多说上代码:
#!/bin/bash
#上方shell也可以是zsh和ash(嵌入式) 但不能是sh/dash/hush!
pwd=$(pwd)
#确认目前路径
if [ "$1"x = "x" ]
then
read -p dir: dir
#如未带参数则要求输入
else
dir=$1
#初始化参数
fi
if [ "$(cd $dir 2>&1)"x != "x" ]
#确定是否为文件
then
if [ "$(echo $dir | grep " ")"x != "x" ]
#是多个文件,跳过并切换回目录。。。
then
cd $pwd
else
random=$(( (RANDOM % 10000) + 1 ))
mkdir /tmp/$random
cp $dir /tmp/$random
#把文件放入临时目录
dir=/tmp/$random
#重置变量
fi
fi
if [ "$(echo $dir | grep " ")"x != "x" ]
#如果输入内有空格(即多个文件/目录)
then
random=$(( (RANDOM % 10000) + 1 ))
mkdir /tmp/$random
#把文件放入临时目录
for i in $dir
do
cp -r $i /tmp/$random/$i 2>/dev/null
if [ $? -ne 0 ]
then
#echo oops...
cp $i /tmp/$random
#如果是文件使用上方方法复制会失败,尝试重新复制
fi
done
dir=/tmp/$random
#重置变量
fi
cd $dir
#在目录下压缩后不会有莫名其妙的大量目录
(cat <<'EOF' &&
#!/bin/sh
skip=12 #如修改下方代码记得修改行数 以vim显示的为准
gztmpdir=./$0.ext
mkdir ./$0.ext
case `printf 'X\n' | tail -n +1 2>/dev/null` in
X) tail_n=-n;;
*) tail_n=;;
esac
#echo $(tail $tail_n +$skip <"$0") #启用后可以检查过滤后的是否为压缩包
tail $tail_n +$skip <"$0" | tar xzf - -C $0.ext
rm ./$0
EOF
tar czf - . ) > "$dir.2"
chmod +x $dir.2
if [ "$random"x != "x" ]
#如果有随机数变量则是在临时目录下压缩的 需要复制回来
then
mv /tmp/$random.2 $pwd
rm /tmp/$random -r
else
#如果没有则是单目录压缩 直接将文件移动回来即可
mv ./$dir.2 $pwd
fi
--------------
你已经看完这篇博文了!
本文来自博客园,作者:星如雨yu,转载请注明原文链接:https://www.cnblogs.com/tianpanyu/p/15882750.html
另,建议转载手动看一眼,把代码块转过去呗(超小声嘀咕)