สมมติว่าฉันมีชื่อไฟล์ugly_name.tar
ซึ่งเมื่อแตกแล้วจะกลายเป็นugly_name
ไดเรกทอรี ฉันสามารถใช้คำสั่งใดได้บ้างที่ชื่อไดเรกทอรีที่ได้คือpretty_name
อะไร
สมมติว่าฉันมีชื่อไฟล์ugly_name.tar
ซึ่งเมื่อแตกแล้วจะกลายเป็นugly_name
ไดเรกทอรี ฉันสามารถใช้คำสั่งใดได้บ้างที่ชื่อไดเรกทอรีที่ได้คือpretty_name
อะไร
คำตอบ:
สิ่งนี้น่าจะใช้ได้:
mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
-C
เปลี่ยนไดเรกทอรีที่ระบุก่อนนำออก (หรือบรรจุ) --strip-components
ลบจำนวนไดเรกทอรีที่ระบุจากชื่อไฟล์ที่จัดเก็บในไฟล์เก็บถาวร
โปรดทราบว่านี่ไม่ใช่การพกพาจริงๆ GNU tar และอย่างน้อย BSAR บางตัวมี--strip-components
ตัวเลือก แต่ดูเหมือนจะไม่มีอยู่บนแพลตฟอร์มอื่นที่คล้ายยูนิกซ์
วิธีการทำสิ่งนี้จะทำงานได้ทุกที่
tar xf ugly_name.tar && mv ugly_name pretty_name
tar -xvf /tmp/backupfiles.tar -C /var/www/
mv ugly-* pretty_name
ugly_name
ไดเรกทอรีอยู่แล้ว โดยวิธีการที่ความงามอยู่ในสายตาของคนดู
ด้วยGNU tar ≥1.16ใช้--transform
ในการใช้การแปลง sed regexp กับแต่ละชื่อไฟล์ (การแปลงจะถูกนำไปใช้กับพา ธ เต็มในไฟล์เก็บถาวร):
tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'
หากugly_name
เป็นองค์ประกอบระดับบนสุดของชื่อไฟล์ทั้งหมดในไฟล์เก็บถาวรคุณไม่จำเป็นต้องกังวลกับการจับคู่ที่แม่นยำ:
tar xf foo.tar --transform 's/ugly_name/pretty_name/'
หากคุณไม่ทราบชื่อของไดเรกทอรีระดับบนสุดคุณยังคงสามารถใช้วิธีนี้ได้แม้ว่าคุณอาจต้องการ--strip-components
แทน
tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'
ด้วยpax
ยูทิลิตีการเก็บถาวร POSIX ให้ใช้-s
ตัวเลือกซึ่งรับการแทนที่แบบ sed-like เป็นอาร์กิวเมนต์
pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'
ใช้สิ่งนี้:
tar -xvf ugly_name.tar
mv ugly_name pretty_name
&&
ตัวดำเนินรายการระหว่างสองคำสั่งเหล่านั้นดังนั้นคำสั่งที่สองจะถูกเรียกใช้งานหากคำสั่งแรกประสบความสำเร็จ
ugly_name
อยู่แล้ว
วิธีที่ง่ายที่สุด
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
--one-top-level=pretty_name
--strip-components 1
(2) ในทางกลับกันคำตอบที่ได้รับการยอมรับ (โพสต์โดยจ้า)ให้บริการโดยไม่ต้อง--strip-components 1
--one-top-level=pretty_name
(3) คุณสามารถอธิบายได้หรือไม่ว่าทำไมคำตอบของคุณเมื่อรวมตัวเลือกเหล่านี้ดีกว่าคำตอบแบบเก่า กรุณาอย่าตอบในความคิดเห็น; แก้ไข คำตอบของคุณเพื่อให้ชัดเจนและสมบูรณ์ยิ่งขึ้น
--strip-component 1
จะต้องมีอย่างใดอย่างหนึ่งmkdir
หรือวิธีการอื่นที่คุณเพิ่งได้รับ--strip-components 1
pretty_name/ugly_name/
จากถาม Ubuntu คำตอบนี้ใช้ได้สำหรับฉัน:
tar zxvf ugly_name.tgz --one-top-level=pretty_name
`--one-ระดับบนสุด [= dir]
บอก tar เพื่อสร้างไดเรกทอรีใหม่ภายใต้ไดเรกทอรีการแยก (หรือไดเรกทอรีที่ส่งไปยัง `-C ') และใช้เพื่อป้องกัน tarbombs ในกรณีที่ไม่มีอาร์กิวเมนต์ dir ชื่อของไดเร็กทอรีใหม่จะเท่ากับชื่อฐานของไฟล์เก็บถาวร (ชื่อไฟล์ลบส่วนต่อท้ายของไฟล์เก็บถาวรหากรู้จัก) ชื่อสมาชิกใด ๆ ที่ไม่ได้ขึ้นต้นด้วยชื่อไดเรกทอรีนั้น (หลังจากการแปลงจาก `--transform 'และ` --strip-components') จะถูกนำหน้าด้วย ได้รับการยอมรับคำต่อท้ายชื่อไฟล์ `.tar' และการบีบอัดใด ๆ ต่อท้ายที่รู้จักโดยดูอัตโนมัติบีบอัด
ตามที่ระบุไว้ในความคิดเห็นวิธีนี้ใช้ไม่ได้กับคลังข้อมูลที่จัดรูปแบบอย่างถูกต้องอย่างไรก็ตามเมื่อมีคำตอบอื่นแสดงให้เห็นคุณควรเพิ่ม--strip-components 1
เพื่อให้การทำงานจริง ๆ ฉันได้ทดสอบกับตัวเลือกใหม่นี้และมันใช้ได้ทั้งกับไฟล์เก็บถาวรที่มีชื่อระดับสูงและรายการที่ไม่มี
pretty_name
ด้วยไดเรกทอรีระดับบนสุดเดิมที่อยู่ภายในนั้น เช่นถ้าtar xzf ugly_name.tgz
จะสร้างไดเรกทอรีชื่อugly_name/
คำสั่งที่คุณให้ไว้จะสร้างpretty_name/ugly_name/
ขึ้น