ไฟล์. tar ที่ไม่มีโครงสร้างไดเร็กทอรี


32

ฉัน.taring example/super_user/Output.*ไฟล์บางอย่างกับเส้นทาง

ผลลัพธ์ที่ได้.tarจะเป็นดังนี้:

+ example
    + super_user
          - Output.zip
          - Output.xml
          - Output.txt

แต่ฉันต้องการให้ไฟล์เป็นดังต่อไปนี้:

- Output.zip
- Output.xml
- Output.txt

คุณรู้ไหมว่าฉันจะทำสิ่งนี้ได้อย่างไรในขณะที่ยังอยู่ในไดเรกทอรีอื่น?


ตรวจสอบให้แน่ใจเพื่อหลีกเลี่ยงtarbombsด้วยคลังเก็บเช่นนั้น
grawity

tar --strip-components = 1,000?
Zaar Hai

คำตอบ:


11

tar จะรักษาโครงสร้างของไฟล์และโฟลเดอร์ดังนั้นฉันไม่คิดว่าจะมีวิธีใดที่จะแนะนำ tar ให้เรียบลำดับชั้นในเวลาที่สร้าง

วิธีแก้ปัญหาหนึ่งคือเปลี่ยนไดเรกทอรีชั่วคราวสร้าง tar จากนั้นย้อนกลับ - ตัวอย่างสั้น ๆ ด้านล่าง:

cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..

27

หากไดเรกทอรี 'ตัวอย่าง' อยู่ที่รูทของระบบไฟล์นี่เป็นอีกวิธีหนึ่ง:

tar -C /example/super_user -cvf result.tar .

สิ่งนี้จะเปลี่ยนไดเรกทอรีเป็นจุดที่คุณต้องการทำ tar caveat คือถ้ามีไดเรกทอรีย่อยใด ๆ ภายใต้ / example / super_user โครงสร้างไดเรกทอรีจะถูกเก็บไว้สำหรับไดเรกทอรีย่อยเหล่านี้


1
นี่คือคำตอบของปัญหาที่เกิดขึ้น ข้อแม้ที่กล่าวถึงไม่ใช่ปัญหาในกรณีนี้ คำตอบอื่น ๆ ทั้งหมดเป็นวิธีการแก้ปัญหาบัญชีสำหรับการเปลี่ยนแปลงของปัญหา
joki

นั่นคือทางออกสำหรับคำถามนี้ ไดเรกทอรีไม่จำเป็นต้องเป็นรูทหากว่าโครงสร้างไดเรกทอรี/home/u/foo/barทำงานได้/home/bดีแล้วก็ใช้tar -C foo/bar -cvf qiz.tar .งานได้ดี caveat หนึ่ง แต่เป็นว่าคุณไม่สามารถใช้สัญลักษณ์เช่นtar -C foo/bar -cvf qiz.tar *.log, tar -C foo/bar -cvf qiz.tar "*.log"หรือtar -C foo/bar -cvf qiz.tar "foo/bar/*.log"จะไม่ทำงาน
Brice

1
ควรสังเกตว่าคุณสามารถใช้-Cหลาย ๆ ครั้งในtarคำสั่งเดียวหากคุณต้องการเพิ่มหลายไฟล์ที่กระจายไปทั่วหลายไดเรกทอรี แต่ยังคงต้องการให้ไฟล์ tar ถูกแบน
zero298

10

ฉันโพสต์คำตอบของฉันที่นี่:

https://stackoverflow.com/questions/13924856/unix-tar-do-not-preserve-directory-structure

โพสต์ใหม่ (สำหรับ ppl ขี้เกียจ)


มันน่าเกลียด ... แต่มันใช้งานได้ ...

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

นี่คือการแสดงออก:

's/.*\///g' (ลบทุกอย่างก่อนหน้า '/')

นี่คือคำสั่งสุดท้าย:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info


7

หากต้องการสร้าง tar (ARCHIVE.tar) พร้อมไฟล์ทั้งหมดจากไดเรกทอรี (DIR) โดยไม่ต้องมีข้อมูลไดเรกทอรีหลัก (ไม่ใช่แม้แต่. /) คุณสามารถใช้สิ่งต่อไปนี้:

find "DIR" -type f -printf "%f\n" | xargs tar cf ARCHIVE.tar -C "DIR"

คุณสามารถเล่นกับการค้นหาเพื่อจำกัดความลึกเลือกไฟล์ที่ต้องการและอื่น ๆ อีกมากมาย

โชคดี!


ฉันได้รับ "find: -printf: ไม่ทราบหลักหรือโอเปอเรเตอร์" ที่คำสั่ง OSX find เคล็ดลับใด ๆ
TCB13

-printfเป็นคำสั่งที่ไม่ได้มาตรฐาน หลายคนทำงานกับการค้นหารุ่นที่ระบุเท่านั้น โดยปกติเราจะทำเครื่องหมายคำเหล่านั้นเมื่อตอบคำถามเกี่ยวกับSuper User (เช่น "-blah เป็นส่วนขยาย Gnu และจะไม่ทำงานทุกที่")
Hennes

3

ฉันสร้างไดเรกทอรีชั่วคราว และในไดเรกทอรีสร้างลิงค์สัญลักษณ์ไปยังไฟล์ทั้งหมดไปยังไฟล์ที่จะรวม จากนั้นฉันก็ทำ tar -h -C เพื่อให้ไฟล์ทั้งหมด (ไม่ใช่ลิงก์ แต่เนื้อหาของไฟล์) จะรวมอยู่ในไฟล์เก็บถาวรด้วยชื่อที่ต้องการ


1

หากสิ่งเหล่านั้นเป็นเนื้อหาทั้งหมดของ tarball คุณสามารถใช้--strip-componentsตัวเลือกของ GNU tar เพื่อลบ 2 ระดับก่อนไฟล์


ฉันมีตัวเลือก--strip-pathเท่านั้น แต่การใช้มันจะไม่เปลี่ยนแปลงอะไรเลย

1

อีกวิธีในการเปลี่ยนไดเรกทอรีชั่วคราวคือการใส่คำสั่งcdและtarไว้ในวงเล็บ( ):

(cd example/super_user; tar -cvf ../../result.tar *)

ข้อดีของการทำเช่นนี้คือคุณจะกลับมาที่ไดเรกทอรีเดิมโดยปริยายเมื่อบล็อกเสร็จ เช่นไม่จำเป็นต้องpushd.. popdบล็อกหรือติดตามตำแหน่งที่จะcdกลับไป


0
pushd example/super_user
tar -cf output.tar Output.*
popd

pushd ดันพา ธ ไดเร็กทอรีปัจจุบันไปยังDIRสแต็กและย้ายไปยังโฟลเดอร์เนื้อหา popdจากนั้นคุณย้ายกลับไปยังไดเรกทอรีเดิมโดยใช้

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