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

 

posted @ 2022-02-11 13:01  星如雨yu  阅读(400)  评论(0编辑  收藏  举报