参考【https://www.nodeloc.com/d/20115】写了个bash版本的,理论上支持所有带 bash shell 的 GNU Linux。
代码
#!/bin/bash
# TODO:
# 避免将自己打包进去
# 允许打包“.”开头的隐藏文件
target_dir=.
output_file=./unpack.sh
while getopts ":d:o:" arg_name; do
case $arg_name in
d)
if [ ! -d $OPTARG ]; then
echo "错误: \"$OPTARG\" 不存在,或其并非是一个目录"
exit 1
fi
target_dir=$OPTARG
;;
o)
output_file=$OPTARG
;;
:)
echo "错误: 参数 -$OPTARG 后还需要接一个字符串"
exit 1
;;
\?)
echo "错误: 未知参数 -$OPTARG" >&2
exit 1
;;
esac
done
unpack_script=$(cat <<EOF
#!/bin/bash
echo "解包文件中..."
EOF
)
function read_dir() {
for file in `ls $1`
do
current_path=$1/$file
if [ -d $current_path ]; then
read_dir $current_path
else
echo 打包文件 $current_path 中...
save_path=.${current_path#*$target_dir}
file_base64=$(base64 $current_path)
unpack_script=$(cat <<UNPACK_SCRIPT
${unpack_script}
echo 正在写入文件到 $save_path ...
father_dir=\$(dirname "$save_path")
if [ ! -d \$father_dir ]; then
mkdir -p \$father_dir
fi
echo -n "\$(cat <<EOF
${file_base64}
EOF
)" | base64 -d > $save_path
UNPACK_SCRIPT
)
fi
done
}
read_dir $target_dir
echo -n 正在保存解包脚本为 $output_file ...
echo -n "$unpack_script" > $output_file
chmod +x $output_file
echo 完成
用法
保存为 pack.sh,放在 PATH 变量设置的目录中。
来到需要打包的目录,运行 pack.sh 即可打包整个目录,在当前目录输出为 unpack.sh 且带执行权限,执行这个文件就会在其所在目录进行解包。
可选参数:
-o:指定解包脚本生成位置,默认为打包目标目录。
-d:指定打包目标目录,默认为当前文件夹。