ฉันจะแยกเนื้อหาของรอบต่อนาทีได้อย่างไร


154

ฉันมีรอบต่อนาทีและฉันต้องการที่จะรักษามันเหมือน tarball ฉันต้องการแยกเนื้อหาลงในไดเรกทอรีเพื่อให้ฉันสามารถตรวจสอบเนื้อหา ฉันคุ้นเคยกับคำสั่งการสืบค้นของแพ็คเกจที่ถอนการติดตั้ง ฉันไม่ต้องการเพียงแค่รายการเนื้อหาของรอบต่อนาที กล่าวคือ

$ rpm -qpl foo.rpm

ฉันต้องการตรวจสอบเนื้อหาของไฟล์หลายไฟล์ที่มีอยู่ในรอบต่อนาที ฉันไม่ต้องการติดตั้งรอบต่อนาที ฉันยังรับรู้ถึงความสามารถของ rpms ที่จะทำการดัดแปลงเพิ่มเติมในส่วนของโพสต์% และวิธีตรวจสอบ กล่าวคือ

$ rpm -qp --scripts foo.rpm

อย่างไรก็ตามในกรณีนี้ที่ฉันไม่ต้องกังวล

คำตอบ:


184

คุณลองคำสั่งrpm2cpioหรือไม่ ดูตัวอย่างด้านล่าง:

$ rpm2cpio php-5.1.4-1.esp1.x86_64.rpm | cpio -idmv

/etc/httpd/conf.d/php.conf  
./etc/php.d  
./etc/php.ini  
./usr/bin/php  
./usr/bin/php-cgi  
etc 

28
ฉันประหลาดใจที่ลีนุกซ์ลีนุกซ์ไม่ได้จัดเตรียมโปรแกรมเสริมเพื่อให้ง่ายขึ้น (เช่น rpmextract bla.rpm), เพราะนี่เป็นการดำเนินการทั่วไป ผู้ใช้ไม่จำเป็นต้องใส่ใจกับรูปแบบ cpio ตัวกลาง
Alan Evangelista

2
อย่าประหลาดใจ @AlanEvangelista นี่เป็นส่วนหนึ่งของหลักสูตร
ngreen

สิ่งนี้ต้องการการเข้าถึงรูทสำหรับการติดตั้ง rpm2cpio :(
törzsmókus

9
@ AlanEvangelista ฉันประหลาดใจที่รอบต่อนาทีเป็นรูปแบบที่ไม่ดี เปรียบเทียบกับคนอื่น ๆ เช่น deb ซึ่งเป็นเพียงจดหมายเหตุที่เรียบง่ายซึ่งเป็นไปตามปรัชญาของ UNIX
Trismegistos

1
@SumitMurari แน่นอนว่ามันแย่ ฉันแค่เสนอทางออกให้กับสถานการณ์ของtörzsmókus
MirroredFate

66
$ mkdir packagecontents; cd packagecontents
$ rpm2cpio ../foo.rpm | cpio -idmv
$ find . 

สำหรับการอ้างอิง: ข้อโต้แย้ง cpio คือ

-i = extract
-d = make directories
-m = preserve modification time
-v = verbose

ฉันพบคำตอบที่นี่: คำตอบของ lontar


1
"rpm2cpio foo.rpm | cpio -idmv" ใช้งานได้สำหรับฉัน ก็เพียงพอที่จะแยกเนื้อหาของรอบต่อนาทีที่เส้นทางปัจจุบัน
ปรสิต

32

สำหรับผู้ที่ไม่มี rpm2cpio นี่คือสคริปต์ rpm2cpio.sh โบราณที่แยก payload ออกจากแพ็คเกจ * .rpm

โพสต์ใหม่เพื่อลูกหลาน…และรุ่นต่อไป

เรียกใช้สิ่งนี้: ./rpm2cpio.sh .rpm | cpio -dimv

#!/bin/sh

pkg=$1
if [ "$pkg" = "" -o ! -e "$pkg" ]; then
    echo "no package supplied" 1>&2
    exit 1
fi

leadsize=96
o=`expr $leadsize + 8`
set `od -j $o -N 8 -t u1 $pkg`
il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
# echo "sig il: $il dl: $dl"

sigsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $sigsize + \( 8 - \( $sigsize \% 8 \) \) \% 8 + 8`
set `od -j $o -N 8 -t u1 $pkg`
il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
# echo "hdr il: $il dl: $dl"

hdrsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $hdrsize`
EXTRACTOR="dd if=$pkg ibs=$o skip=1"

COMPRESSION=`($EXTRACTOR |file -) 2>/dev/null`
if echo $COMPRESSION |grep -q gzip; then
        DECOMPRESSOR=gunzip
elif echo $COMPRESSION |grep -q bzip2; then
        DECOMPRESSOR=bunzip2
elif echo $COMPRESSION |grep -iq xz; then # xz and XZ safe
        DECOMPRESSOR=unxz
elif echo $COMPRESSION |grep -q cpio; then
        DECOMPRESSOR=cat
else
        # Most versions of file don't support LZMA, therefore we assume
        # anything not detected is LZMA
        DECOMPRESSOR=`which unlzma 2>/dev/null`
        case "$DECOMPRESSOR" in
            /* ) ;;
            *  ) DECOMPRESSOR=`which lzmash 2>/dev/null`
             case "$DECOMPRESSOR" in
                     /* ) DECOMPRESSOR="lzmash -d -c" ;;
                     *  ) DECOMPRESSOR=cat ;;
                 esac
                 ;;
        esac
fi

$EXTRACTOR 2>/dev/null | $DECOMPRESSOR

ฉันได้รับข้อผิดพลาด "unlzma: ส่วนหัว lzma ที่ไม่ดี" โดยใช้ Alpine Linux พยายาม rpms หลายครั้ง
jekennedy

27

บางครั้งคุณอาจพบปัญหากับไฟล์เก็บถาวร RPM ระดับกลาง:

cpio: หมายเลขในรูปแบบ
cpio: หมายเลขในรูปแบบ
cpio:
หมายเลขในรูปแบบ . .
cpio: สิ้นสุดการเก็บถาวรก่อนกำหนด

นั่นหมายความว่ามันสามารถบรรจุได้วันนี้เป็นการบีบอัด LZMA2 ตามปกติโดยxz:

rpm2cpio <file>.rpm | xz -d | cpio -idmv

มิฉะนั้นคุณสามารถลอง:

rpm2cpio <file>.rpm | lzma -d | cpio -idmv

2
ฉันเพิ่งพบสิ่งนี้ ขอบคุณ!
Sam Stoelinga

2
มีประโยชน์มาก. ขอบคุณครับ!
ILIV

1
ผู้ช่วยชีวิต @LasseHalbergHaarbye ฉันเพิ่มไปยังคำตอบที่ยอมรับแล้ว
โจเซฟ Farah

ฉันได้รับข้อผิดพลาด "จำนวนที่ผิดรูปแบบ" และ "ข้อผิดพลาดก่อนสิ้นสุดการเก็บถาวร" แต่โซลูชันที่โพสต์ไม่ทำงานสำหรับฉัน ฉันต้องทำrpm2cpio <file>.rpm | bsdtar -xf -(ไม่มี cpio) เพื่อให้มันใช้งานได้
jackkamm

ไฟล์เก็บถาวรกลางจบลงด้วยการจัดรูปแบบ gzip สำหรับฉันดังนั้นฉันจึงใช้gunzipแทนxzหรือใช้lzmaงานได้ดี
jayhendren

9

ดิสทริบิวชันส่วนใหญ่ติดตั้งไฟล์ลูกกลิ้งของแอพ GUI ที่คลายไฟล์ tar, zip, rpm และอีกมากมาย

file-roller --extract-here package.rpm

สิ่งนี้จะแยกเนื้อหาในไดเรกทอรีปัจจุบัน


6

7-zipเข้าใจคลังข้อมูลเกือบทุกประเภทรวมถึง rpm และ cpio ที่รวมไว้


ฉันได้ลองกับ 7 zip และใช้งานได้อย่างสมบูรณ์แบบ
anshul

5

คุณสามารถทำได้tar -xvf <rpm file>เช่นกัน!


ไม่สามารถทำซ้ำได้ด้วยแพ็คเกจ. rpm คุณอาจต้องการแก้ไขคำตอบของคุณ
gvlasov

9
สิ่งนี้ใช้ได้กับ OS X - หรือระบบอื่น ๆ ที่ใช้ชุดตัวเลือกtarที่ใช้libarchiveภายใต้ประทุน
Glenjamin

2
ฉันได้รับข้อผิดพลาด: นี่ไม่เหมือนกับไฟล์เก็บถาวร tar
wp-overwatch.com

สิ่งนี้ใช้ได้กับฉันใน MacOS 10.14.1 ด้วย bsdtar 2.8.3 - libarchive 2.8.3 มันอาจขึ้นอยู่กับชนิดของการบีบอัดที่ใช้ สคริปต์ rpm2cpio.sh ดูเหมือนว่าจะตรวจสอบการบีบอัดหลายประเภทก่อนที่จะส่งไปยังเครื่องมือที่เหมาะสมสำหรับการแยก
2xj

ตั้งแต่การทำงานแก้ไขดังนั้นจะไม่ให้ฉันเพิ่ม 3 ตัวอักษรที่จะแก้ไขคำตอบก็ควรจะเสริมว่านี้ต้องของ bsdtarlibarchive Homebrew บน Mac ลิงก์tarไปยังค่าเริ่มต้น แต่บน OS อื่น ๆtarหมายถึง GNU tar
Atemu

5

ตัวจัดการไฟล์ข้อความที่ทรงพลังmc (Midnight Commander, เตือนผู้บังคับการนอร์ตันครั้ง DOS เก่า) มีความสามารถในการตรวจสอบและคลายไฟล์. rpm และ. rpms เพียงแค่ "เปิด" ไฟล์. rpm (s) ภายใน mc และเลือกCONTENTS.cpio: สำหรับรอบต่อนาทีคุณจะได้รับการเข้าถึงแผนผังการติดตั้งสำหรับ rpms คุณจะสามารถเข้าถึงไฟล์. spec และแพ็กเกจแหล่งที่มาทั้งหมด




1

อย่างน้อยใน OpenSuse unrpmคำสั่งจะมาพร้อมกับbuildแพ็คเกจ

ในไดเรกทอรีที่เหมาะสม (เพราะนี่คือระเบิดเก็บถาวร):

unrpm file.rpm

1

คัดลอกไฟล์. rpm ในโฟลเดอร์แยกต่างหากจากนั้นรันคำสั่งต่อไปนี้ $ yourfile.rpm | cpio -idmv


นี่ควรเป็นความคิดเห็น
ketan

1

การทดสอบ "DECOMPRESSION" ล้มเหลวบน CygWin ซึ่งเป็นหนึ่งในแพลตฟอร์มที่มีประโยชน์ที่สุดสำหรับมันเนื่องจากการตรวจสอบ "grep" สำหรับ "xz" เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ผลลัพธ์ของการตรวจสอบ "การบีบอัด:" คือ:

COMPRESSION='/dev/stdin: XZ compressed data'

เพียงแทนที่ 'grep -q' ด้วย 'grep -q -i' ทุกที่ดูเหมือนว่าจะแก้ปัญหาได้ดี

ฉันได้ทำการอัปเดตบางอย่างโดยเฉพาะการเพิ่มความคิดเห็นและใช้คำสั่ง "case" แทนการซ้อนคำสั่ง "if" และรวมถึงการแก้ไขด้านล่าง

#!/bin/sh
#
# rpm2cpio.sh - extract 'cpio' contents of RPM
#
# Typical usage: rpm2cpio.sh rpmname | cpio -idmv
#

if [ "$# -ne 1" ]; then
    echo "Usage: $0 file.rpm" 1>&2
    exit 1
fi

rpm="$1"
if [ -e "$rpm" ]; then
    echo "Error: missing $rpm"
fi


leadsize=96
o=`expr $leadsize + 8`
set `od -j $o -N 8 -t u1 $rpm`
il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
# echo "sig il: $il dl: $dl"

sigsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $sigsize + \( 8 - \( $sigsize \% 8 \) \) \% 8 + 8`
set `od -j $o -N 8 -t u1 $rpm`
il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
# echo "hdr il: $il dl: $dl"

hdrsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $hdrsize`
EXTRACTOR="dd if=$rpm ibs=$o skip=1"

COMPRESSION=`($EXTRACTOR |file -) 2>/dev/null`
DECOMPRESSOR="cat"

case $COMPRESSION in
    *gzip*|*GZIP*)
        DECOMPRESSOR=gunzip
        ;;
    *bzip2*|*BZIP2*)
        DECOMPRESSOR=bunzip2
        ;;
    *xz*|*XZ*)
        DECOMPRESSOR=unxz
        ;;
    *cpio*|*cpio*)
        ;;
    *)
        # Most versions of file don't support LZMA, therefore we assume
        # anything not detected is LZMA
        DECOMPRESSOR="`which unlzma 2>/dev/null`"
        case "$DECOMPRESSOR" in
            /*)
                DECOMPRESSOR="$DECOMPRESSOR"
                ;;
            *)
                DECOMPRESSOR=`which lzmash 2>/dev/null`
                case "$DECOMPRESSOR" in
                    /* )
                        DECOMPRESSOR="lzmash -d -c"
                        ;;
                    *  )
                        echo "Warning: DECOMPRESSOR not found, assuming 'cat'" 1>&2
                        ;;
                esac
                ;;
        esac
esac

$EXTRACTOR 2>/dev/null | $DECOMPRESSOR

1

7-Zip สามารถแยกเนื้อหาได้ มันทำงานในลักษณะเดียวกับที่ไฟล์ tar.gz ทำงาน ไฟล์บีบอัดภายในไฟล์บีบอัด

บน Windows 7 Pro ที่ติดตั้ง 7-Zip:

คลิกขวาที่ไฟล์ rpm เลื่อนเมาส์ไปเหนือ 7-Zip ในเมนูบริบท เลือกแยกไปที่ "ชื่อไฟล์"

เข้าสู่โฟลเดอร์ชื่อไฟล์

คลิกขวาที่ไฟล์ cpio เลื่อนเมาส์ไปเหนือ 7-Zip ในเมนูบริบท เลือกแยกไปที่ "ชื่อไฟล์"

คุณทำเสร็จแล้ว โฟลเดอร์ที่มี "ชื่อไฟล์" มีเนื้อหาที่แตกสำหรับการตรวจสอบ

ฉันรู้ว่าพวกคุณลินุกซ์ดูถูกสิ่งต่าง ๆ ได้ง่าย แต่ในระยะยาวถ้าคุณต้องใช้เวลาตามล่าหาทางออกสำหรับปัญหาง่ายๆเช่นนี้ ความไร้ประสิทธิภาพนั้นทำให้คุณต้องเสียเงิน

จากข้อเท็จจริงที่ว่าพวกคุณ Linux ดูถูกความเรียบง่ายที่มีประสิทธิภาพฉันสงสัยอย่างมากว่ารุ่น 7-Zip ของ Linux จะทำสิ่งเดียวกันในแบบเดียวกัน

ทำไมต้องทำให้ง่ายเมื่อคุณทำให้โง่อย่างจริงจังและอ้างว่าเป็นอัจฉริยะในเวลาเดียวกัน

เพื่อให้ชัดเจน ฉันไม่ใช่แฟนบอยของ Windows จริงๆแล้วฉันกำลังมองหาการย้ายไปที่ลินุกซ์ ฉันไม่สามารถต้านทานโอกาสที่จะถูสิ่งที่นักพัฒนา Windows จะเห็นเป็นสามัญสำนึกแนวทางปฏิบัติที่ดีที่สุดสำหรับนักพัฒนาในใบหน้าของคุณ

แค่ดีใจที่ฉันโพสต์สิ่งนี้และคุณไม่มีมาร์คฮาร์มอนยืนอยู่ข้างคุณ ตัวแทนพิเศษ Leroy Jethro Gibbs คงจะทำให้คุณตบหัวแล้วไม่ใช้หัว

ฉันไม่รู้ว่ามันคือกฎของกิ๊บส์ แต่กฎคือ: อย่าทำให้สิ่งต่าง ๆ ยากขึ้นสำหรับตัวคุณเองเกินกว่าที่จะเป็น

ตอนนี้เรามาดูกันว่าใครต้องหยุดพักร้อน ดูแล!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.