การสร้างไฟล์เก็บถาวร tar โดยไม่รวมไดเรกทอรีหลัก


62

ฉันกำลังพยายามสร้างโปรแกรมกราฟิกสำหรับสคริปต์ของฉัน

ภายในสคริปต์ฉันใช้ tar เพื่อสร้างไฟล์เก็บถาวร tar

จากโปรแกรมกราฟิกฉันได้รับชื่อเต็มของไฟล์ที่ฉันต้องการสร้างไฟล์เก็บถาวร tar

tar -cvf temp.tar /home/username/dir1/dir2/selecteddir 

tar เก็บถาวรของฉันรวมถึงบ้านชื่อผู้ใช้ dir1, dir2 และ selecteddir ในขณะที่ฉันต้องการ tar เพื่อสร้างการเก็บถาวรเท่านั้นรวมถึง selecteddir

คำตอบ:


79

คุณสามารถใช้-Cตัวเลือกในtarการทำสิ่งนี้ให้สำเร็จ:

tar -C /home/username/dir1/dir2 -cvf temp.tar selecteddir

จากหน้าคนของtar:

-C directory
         In c and r mode, this changes the directory before adding the following files.  
         In x mode, change directories after opening the archive but before extracting 
         entries from the archive.

คุณรู้หรือไม่ว่าฉันสามารถแยก $ path เป็น selecteddir และพา ธ / home / ชื่อผู้ใช้ / dir1 / dir2 ได้อย่างไรฉันจึงสามารถใช้ตัวเลือก -C ได้
Sujit Maharjan

@SujitMaharjan คุณสามารถใช้dirnameเพื่อแยกทุกอย่างจนกระทั่ง "selecteddir" และbasenameเพื่อแยก "selecteddir" ลองทั้งสองคำสั่งด้วย $ path เป็นอาร์กิวเมนต์
mkc

2
น่าจะเพิ่มว่านี่ใช้ได้ทั้ง GNU และ BSD Tar
ลุค Exton

5
โปรดทราบว่าคุณไม่สามารถใช้ globbing กับตัวเลือก -C tar -C /home/username/dir1/dir2 -cvf temp.tar '*.csv'จะไม่ทำงาน
Christian Long

ใช้งานไม่ได้: tar: selecteddir: ไม่สามารถ stat: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
tribbloid

11

มีสองวิธีที่คุณสามารถใช้เพื่อแก้ไขปัญหานี้

ในความคิดของฉันคนแรกนั้นง่ายกว่า เพียงcdเข้าไปในไดเรกทอรีด้านบนที่คุณต้องการบีบอัด dir2ในกรณีนี้มันจะเป็น

$ cd /home/username/dir1/dir2/
$ tar -cvf temp.tar selecteddir

วิธีที่สองคือการใช้ตัวเลือก--transformที่ใช้sedนิพจน์และเรียกใช้กับชื่อไฟล์ หมายเหตุ: คุณจะต้องหลบหนี/ในการsedแสดงออก

$ tar -cvf temp.tar /home/username/dir1/dir2/selecteddir --transform='s/\/home\/username\/dir1\/dir2\///g'

วิธีแรกต้องใช้จุด (.) ที่จุดสิ้นสุดหรือไม่ ฉันลองโดยไม่ได้รับ: tar: Cowardly refusing to create an empty archive. .เมื่อฉันมีจุดมันน่ารำคาญทำให้รากมีไดเรกทอรีชื่อ ดังนั้นปิด แต่ไม่สมบูรณ์
JW01

1
เพิ่มเติมจากความคิดเห็นก่อนหน้าของฉัน ฉันแก้ไขปัญหาของฉันแล้ว $ cd /home/username/dir1/dir2/ && tar -cvf temp.tar selecteddir *ทำงานให้ฉัน .การใช้เครื่องหมายดอกจันแทนจุด Update: Woops - แม้ว่าฉันทำหายไฟล์ที่ซ่อนอยู่
JW01

6

ก่อนอื่นให้ไปที่ไดเรกทอรีทำงาน

cd /your/working/directory/ 

จากนั้นใช้เวทย์มนตร์*:-)

tar -cvf temp.tar *

ฉันพยายามที่จะเก็บไดเรกทอรีที่ซ่อนอยู่และถ้าผมเพิ่มพวกเขาโดยตรง (ไม่มี *) การทำงาน แต่เมื่อใช้ * เพียงเพิ่มชื่อของที่เก็บเพื่อเก็บ ...
Ole

1

ที่จริงฉันพบปัญหาในการใช้คำตอบของ Ketan

tar -C / home / ชื่อผู้ใช้ / dir1 / dir2 -cvf temp.tar selecteddir

เมื่อคุณต้องการที่จะเพียงแค่คัดลอกไฟล์ทั้งหมดใน dir2 เพียงแค่ไฟล์ทั้งหมดจากนั้นฉันก็ออกมาเป็นความคิดแรก:

tar -C / home / ชื่อผู้ใช้ / dir1 / dir2 -cvf temp.tar *

อย่างไรก็ตามเมื่อคุณไม่ได้อยู่ในไดเรกทอรี dir2 มันจะทำให้เกิดปัญหาเนื่องจาก * จะ tar ไฟล์ใน diectroy ปัจจุบันของคุณ และฉันแก้ไขปัญหาโดยใช้คำสั่งด้านล่าง:

 tar -C /home/username/dir1/dir2 -cvf temp.tar ./

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