วิธีการเลือกชื่อไดเรกทอรีในขณะที่ไม่เปิดเผย


124

สมมติว่าฉันมีชื่อไฟล์ugly_name.tarซึ่งเมื่อแตกแล้วจะกลายเป็นugly_nameไดเรกทอรี ฉันสามารถใช้คำสั่งใดได้บ้างที่ชื่อไดเรกทอรีที่ได้คือpretty_nameอะไร

คำตอบ:


171

สิ่งนี้น่าจะใช้ได้:

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

ผมคิดว่าผมจะติดกับรุ่นใบ้ :)
phunehehe

28
@phunehehe: ข้อดีอย่างหนึ่งของรุ่นสมาร์ทก็คือคุณไม่จำเป็นต้องรู้ล่วงหน้าว่าชื่อไดเรกทอรีที่ไม่ได้รับการแปลคืออะไร
tshepang

2
ขอเพิ่มอีกหน่อยได้ไหมว่าใช้งานได้มากกว่า "Pretty_name" คุณสามารถ untar ไปยังไดเรกทอรีเฉพาะด้วยวิธีนี้ ตัวอย่าง:tar -xvf /tmp/backupfiles.tar -C /var/www/
General Redneck

2
ฉันมักจะใช้วิธีโง่และฉันใช้สัญลักษณ์แทนในกรณีที่ฉันไม่ทราบว่าชื่อน่าเกลียดจะเป็นหรือฉันไม่ต้องการที่จะเขียนลง mv ugly-* pretty_name
David Grayson

1
วิธีโง่ไม่ทำงานหากมีugly_nameไดเรกทอรีอยู่แล้ว โดยวิธีการที่ความงามอยู่ในสายตาของคนดู
kmiklas

30

ด้วย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!'

9

ใช้สิ่งนี้:

tar -xvf ugly_name.tar
mv ugly_name pretty_name

9
คุณอาจต้องการใช้&&ตัวดำเนินรายการระหว่างสองคำสั่งเหล่านั้นดังนั้นคำสั่งที่สองจะถูกเรียกใช้งานหากคำสั่งแรกประสบความสำเร็จ
จัดการ

1
สิ่งนี้อาจมีผลกระทบที่ไม่พึงประสงค์หากมีไดเรกทอรีugly_nameอยู่แล้ว
Drew Dormann

7

วิธีที่ง่ายที่สุด

tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1

(1) นี้ไม่ชัดเจนวิธีที่ง่ายที่สุดที่เป็นsmac89 โพสต์คำตอบที่มีโดยไม่ต้อง--one-top-level=pretty_name --strip-components 1(2) ในทางกลับกันคำตอบที่ได้รับการยอมรับ (โพสต์โดยจ้า)ให้บริการโดยไม่ต้อง--strip-components 1 --one-top-level=pretty_name(3) คุณสามารถอธิบายได้หรือไม่ว่าทำไมคำตอบของคุณเมื่อรวมตัวเลือกเหล่านี้ดีกว่าคำตอบแบบเก่า กรุณาอย่าตอบในความคิดเห็น; แก้ไข  คำตอบของคุณเพื่อให้ชัดเจนและสมบูรณ์ยิ่งขึ้น
G-Man

บางทีตัวอย่างจริงอาจช่วยให้คุณชี้แจงได้: `wget dev.mysql.com/get/Downloads/MySQL-5.7/… tar xvf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz --one-top -level = mysql57 --strip-components 1 `
marquicus

คำตอบนี้เป็นสง่ามากขึ้นกว่าที่เป็นหนึ่งเดียวกับ upvote
KaiserKatze

@ G-Man --strip-component 1จะต้องมีอย่างใดอย่างหนึ่งmkdirหรือวิธีการอื่นที่คุณเพิ่งได้รับ--strip-components 1 pretty_name/ugly_name/
davidA

นี่เป็นวิธีที่ง่ายที่สุด
smac89

2

จากถาม 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/ขึ้น
davidA

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