เติมคำนำหน้าเป็น tar


12

ขณะนี้ฉันใช้สคริปต์เชลล์อย่างไม่มีประสิทธิภาพ:

cp -a $MYPATH /tmp/$VERSION
cd /tmp
tar cjf archive.tar.bz2 $VERSION

ฉันต้องการให้ทุกอย่างอยู่ในไดเรกทอรีที่เรียกว่า $ VERSION - มีวิธีการทำเช่นนี้โดยไม่ต้องคัดลอกทุกอย่างเหมือนในสคริปต์ด้านบนหรือไม่


ทำไมการคัดลอกตั้งแต่แรก? ทำไมไม่ tar cjf archive.tar.bz2 $MYPATH?
Chewie

1
@ Chewie เขากล่าวว่าเขาต้องการ $ version เป็น parent dir ในไฟล์เก็บถาวร
Kent

โอ้ฉันเห็นแล้วตอนนี้
Chewie

คำตอบ:


21

รุ่น GNU ของ tar รองรับ --transform ตัวเลือก (และนามแฝงของมัน --xform ) คุณสามารถใช้มันได้เช่นนี้

tar --transform "s/^$MYPATH/$VERSION/" -cf archive.tar.bz2 "$MYPATH"

ตัวอย่างเช่นกำหนดทรีไดเรกทอรีนี้

foo
└── foo.txt

คำสั่ง

tar --transform "s/^foo/bar/" -cf foo.tar.bz2 foo

จะสร้างที่เก็บถาวรเช่น

$ tar -tf foo.tar.bz2
bar/
bar/foo.txt

3
เป็นที่น่าสังเกตว่าวิธีการนี้อาจทำให้ลิงก์สัญลักษณ์เสียหาย prepending flags=r; แก้ปัญหาดังที่กล่าวไว้ใน stackoverflow.com/a/29661783/388803 .
eregon

อย่ารวมเครื่องหมายสแลชต่อท้าย เมื่อฉันใส่เครื่องหมายทับต่อท้ายในการแปลงคำนำหน้าดั้งเดิมจะพลาด เช่น s/^a\//b\//, tar -t ยังคงแสดงให้เห็น a/ ในขณะที่ไฟล์อื่น ๆ ทั้งหมดอยู่ภายใต้ b/; ฉันถือว่านี่เป็นอันตรายและฉันไม่จำเป็นต้องป้องกันไฟล์อื่น ๆ ด้วยคำนำหน้าเดียวกับที่ไม่ใช่ไดเรกทอรีในไฟล์ tar; ดังนั้นไม่มีการสแลชต่อท้ายเป็นเรื่องปกติฉันไม่ทราบวิธีที่ดีที่สุดในการจัดการกรณีของ a/ ถูกแปลง แต่ไม่ใช่ aa/ ถ้ามันเป็นพี่น้องของโหนดรูท
ThorSummoner

13

หากต้องการ tar ไดเรกทอรีปัจจุบันและเพิ่มคำนำหน้าสิ่งนี้ใช้ได้สำหรับฉัน:

tar --transform 's,^\.,$VERSION,' -cf foo.tar .

0

หากคุณสามารถหนีไปได้โดยไม่เก็บลิงก์สัญลักษณ์ไว้ในแผนผังไฟล์ที่คุณกำลังแสดงตัวคุณสามารถทำได้

ln -s $MYPATH /tmp/$VERSION
cd /tmp
tar cjhf archive.tar.bz2 $VERSION

h ตัวเลือกหมายถึง symbian dereference เช่นรวมไฟล์หรือไดเรกทอรีที่ลิงก์ชี้ไปแทนที่จะบันทึกข้อเท็จจริงที่มี symlink และสิ่งที่ชี้ไป

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