专栏首页MyPanda的学习笔记分享一个shell脚本用于“基于已安装的rpm包,创建tar压缩包”

分享一个shell脚本用于“基于已安装的rpm包,创建tar压缩包”

有时候,我们不想在系统中安装rpm包,但是又需要这个rpm包的功能,那么可否实现呢? 这个需求是可以实现的,当我们用tar包去安装这个功能的时候就可以实现了.因为我们知道,rpm 包本质上是 运行了如下的过程:

  1. 运行 pre-script, 进行依赖检查等.
  2. 释放文件到相应的目录.
  3. 运行 post-script 等. 忽略pre-script 和 post-script, 那么其实就是文件的release 过程,所以可以把相应文件收集起来,然后打包就可以了.

下面的脚本在系统中没有安装 对应rpm包的时候,会查找对应的 tar包,然后释放到系统中,如果系统中已经安装了对应的rpm包,那么会打包生成相应rpm的tar 包. 如果把这个tar包放到目标系统中,那么目标系统需要和rpm包所在的系统是相同的.

#!/bin/bash
if [ $# -lt 1 ];then
    echo -e "Usage:\n`basename $0` {RPM_PACKAGE_NAME}  [OPTION]\n*************************************************************\nRPM_PACKAGE_NAME:\nThe rpm package name, this package must be installed already if you want to archive it. If you want to make portable version for this rpm package, then related .tar.gz file must be existing on /tmp/.\nOPTION:\nAvailable option value is : -i/-I. This option used for cp commands, it will come to interactive mode if need overwrite a existing file during release the RPM Packages. By default, it is '-n'.\n*************************************************************"
    exit -1
fi
PKGNAME=$1
FLAG="n"
if [[ -n $2 ]];then
    if [[ $2="-i" || $2="-I" ]];then
        FLAG="i"
    fi
fi
function OutTarPkg
{
set -e 
mkdir -p /tmp/Free_${PKGNAME}_FileList
for i in `rpm -qR $PKGNAME  | awk -F'[(]' '{print $1}' `;do rpm -q --whatprovides $i >/dev/null && echo $i;done  >/tmp/Free_${PKGNAME}_FileList/deps.txt
rpm -qR $PKGNAME >/tmp/Free_${PKGNAME}_FileList/deps.source
set +e
for i in `rpm -ql $PKGNAME`;
do 
    n_path=`echo $i | sed "s#^#/tmp/Free_${PKGNAME}_FileList#"`
    dir_name=`echo $n_path |  awk -F'/' '{for(i=1;i<NF;i++)printf("%s/",$i)}'`
    mkdir -p $dir_name 
    cp -L --preserve=all  $i  $n_path >/dev/null  2>/dev/null  #This parts, not use -R, because it will copy all the related files under the directory.
done 
cd /tmp
tar -czvf ./${PKGNAME}_RPM.tar.gz  ./Free_${PKGNAME}_FileList/ >/dev/null 
rm -rf /tmp/Free_${PKGNAME}_FileList 
}

function DepsChk
{
for i in `cat ./deps.txt`;
do
        rpm -q --whatprovides $i >/dev/null
        if [ $? -ne 0 ];then
            j=`echo $i | awk -F. '{print $1}'`
            rpm -q --whatprovides $j >/dev/null 
            if [ $? -ne 0 ];then
                echo "Dependency Required, no packages provides for: $i"
                exit 1
            fi
        fi
done
echo "1. The Dependency verify results: PASS."
}


function ReleaseFile
{
cd /tmp
if [ ! -s /tmp/${PKGNAME}_RPM.tar.gz ];
then
    echo -e "Please Verify the file: ${PKGNAME}_RPM.tar.gz exists in the path /tmp/.\nExit with code 2."
    exit 2
fi
set -e
tar -xzvf ./${PKGNAME}_RPM.tar.gz   >/dev/null 
cd ./Free_${PKGNAME}_FileList
set +e
DepsChk
rm -f deps.txt
set -e
for i in `find . -iname "*" -type f | grep -Evi "deps.source|deps.txt" | sed 's/.//'`;
do 
    s_file=`echo $i | sed 's/^/./'`
    if [ -f $i ];then
        mv $i  $i.`date +%Y%m%d_%H%M%S`    #Rename first if the file exists already. 
    fi
    mkdir -p ${i%/*}         #Create the directory first if it not exist by default. 
    cp -L --preserve=all -${FLAG}  ${s_file}  $i    
done 
cd /tmp
rm -rf ./Free_${PKGNAME}_FileList
}

#Start from here: 
rpm -qi $PKGNAME >/dev/null
if [ $? -eq 0 ];then
    echo "System installed packages: $PKGNAME, start get the Tar file for this package."
    OutTarPkg
    if [ $? -eq 0 ];then
        echo "Succeed get the tar.gz file for package: $PKGNAME on path /tmp/${PKGNAME}_RPM.tar.gz"
    else
        echo "Failed to get the tar.gz file."
        exit 3
    fi
else
    echo "Package: $PKGNAME not found in this system, try to release the rpm related files from /tmp/${PKGNAME}_RPM.tar.gz"
    ReleaseFile
    if [ $? -eq 0 ];then 
        echo "2. Release the package files results on the system: Succeed.You can use it now."
    else
        echo "Failed to release the rpm package files."
        exit 5
    fi
fi

本文原创,转载请著名出处.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 编译、链接到载入、运行的大致过程----3.载入

    在Linux下,elf文件有三类,分别是: relocatable , shared object, executable. 见下面的例子:

    qsjs
  • registry(v2)的REST API 简要学习

    关于API的概念你一定不陌生,其实就是一个接口,一种方法,方便其他的应用程序调用该方法从而获得需要的结果; 而对于我们最常使用的浏览器访问,用户的http请求...

    qsjs
  • grub2的学习笔记

    grub2的rpm package含有很多的img, mod, lst 文件(默认路径是/usr/lib/grub/i386-pc/,可以通过对应的rpm -q...

    qsjs
  • 奇数阶魔方阵

    印"魔方阵"。所谓"魔方阵"是指这样的方阵,它的每一行、每一列以及对角线之和均相等。例如,三阶魔方阵为: 8   1   6...

    lop
  • You are My Sunshine

    宅男潇涧
  • 21:最大质因子序列

    21:最大质因子序列 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB描述 任意输入两个正整数m, n (1 < m < n <...

    attack
  • 【Spring实战】—— 14 传统的JDBC实现的DAO插入和读取

    从这篇开始学习Spring的JDBC,为了了解Spring对于JDBC的作用,先通过JDBC传统的流程,实现一个数据库的插入和读取。 从这篇你可以了解到:...

    用户1154259
  • linux--shell

    eadela
  • 7-8 堆栈模拟队列 (25 分)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    韩旭051
  • 提升python项目完成效率的调试方法技巧(上)

    效率提升是极为重要的事情,我们的时间本来就不充裕,不应该过多将时间浪费在调试过程中。对于大型项目光有dubug是不够的,如果需要提高产品调试进度,必须需要采取一...

    OLDPAN

扫码关注云+社区

领取腾讯云代金券