แปลงพา ธ ของไฟล์เก็บถาวร tar โดยไม่แตกไฟล์


10

GNU มีตัวเลือกเรียบร้อยเรียกว่าtar(1) --transformจากหน้าคน:

--transform, --xform EXPRESSION
ใช้ sed แทนที่ EXPRESSION เพื่อเปลี่ยนชื่อไฟล์

สิ่งนี้ช่วยให้การแปลงชื่อพา ธ ได้อย่างรวดเร็วเนื่องจากมีการแยกไฟล์เก็บถาวรเพื่อให้คุณสามารถควบคุมตำแหน่งและวิธีที่จะแตกไฟล์ได้

คำถามของฉันคือมีวิธีที่จะทำการเปลี่ยนแปลงที่คล้ายกันในแหล่งกำเนิด ; เช่นโดยไม่ต้องแยกเก็บถาวร?

ตัวอย่าง

[user@host]$ tar tf test.tar
./foo/blah  ./foo/bleh
[user@host]$ some_deep_magic 's/foo/bar/' test.tar
[user@host]$ tar tf test.tar
./bar/blah  ./bar/bleh

ใช้กรณี

ฉันแจกจ่ายtarไฟล์เก็บถาวรให้กับผู้ใช้ทั่วไปที่ไม่มีส่วนร่วมและต้องการให้มันแยกไปยังเส้นทางที่ถูกต้องโดยไม่มีการรบกวนจากฉัน ฉันกำลังพยายามหลีกเลี่ยงวิธีแก้ปัญหาเล็กน้อยในการแยกไฟล์เก็บถาวรเปลี่ยนชื่อไดเรกทอรีและบรรจุใหม่เนื่องจากไฟล์เก็บถาวรมีขนาดใหญ่


ทำไมคุณไม่เปลี่ยนชื่อเมื่อสร้างมัน
Jose Luis Martin

@JoseLuisMartin ถูกต้อง กรณีการใช้งานของฉันคือที่เก็บถาวรมีอยู่แล้วและอย่างที่ฉันบอกว่าฉันต้องการหลีกเลี่ยงการเปิดหีบห่อแปลงและบรรจุใหม่
โจเซฟอาร์

1
คุณสามารถแก้ไข tar stream โดยไม่ต้องแตกไฟล์ลงในดิสก์: github.com/mafintosh/tar-stream#modifying-existing-tarballs , perldoc.perl.org/5.10.1/Archive/Tar.htmlฯลฯ
vladr

คำตอบ:


3

คุณสามารถเมานต์ไฟล์เก็บถาวรด้วยไฟล์เก็บถาวรหรือ mountavfs และสร้างใหม่อีกครั้ง

archivemount tarfile.tar /mnt
cd /mnt
tar cf /tmp/tarfile.tar --transform 's/foo/bar/' .

การดำเนินการเขียนบนระบบไฟล์เก็บถาวรจะทำให้การเขียนใหม่เต็มรูปแบบบน umount ดังนั้นอย่าคิดว่าเป็นตัวเลือกที่ดีสำหรับไฟล์ขนาดใหญ่

แก้ไข

ฉันไม่ทราบรายละเอียดการใช้งาน แต่ดูเหมือนว่าเรากำลังบันทึกขั้นตอนการเขียนลงในระบบไฟล์

เพียงทดสอบเพื่อแก้ปัญหาเป็ด (เหนือกลาสีเรือของ / usr ของฉัน)

#!/bin/bash

# try to avoid slab cache issues 
cat /tmp/usr.tar > /dev/null

T="$(date +%s)"
tar xf /tmp/usr.tar
tar cf usr.tar usr --transform 's/usr/foo/'
T="$(($(date +%s)-T))"
echo "Tar/Untar seconds: ${T}"

T="$(date +%s)"
archivemount -o readonly -o nobackup /tmp/usr.tar /mnt
tar cf usr.tar /mnt  --transform 's/usr/foo/'
umount /mnt
T="$(($(date +%s)-T))"
echo "Archivemount seconds: ${T}"

T="$(date +%s)"
mountavfs
cd '/root/.avfs/tmp/usr.tar#'
tar cf /tmp/test/usr.tar   --transform 's/usr/foo/' .
T="$(($(date +%s)-T))"
echo "Avfs seconds: ${T}"

เอาท์พุท:

Tar/Untar seconds: 480
Archivemount seconds:  failure, a lot of read errors.
Avfs seconds: 217

ดังนั้น Avfs ชนะ! .


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