วิธีแตกไฟล์ไปยังไดเร็กทอรีอื่นโดยใช้คำสั่ง 'tar'


672

ฉันคิดว่าtar archive.tar /users/mylocationจะใช้งานได้ แต่ไม่ได้ผล ฉันจะทำสิ่งนั้นได้อย่างไร


1
นอกจากนี้ควรค่อนข้างจะอธิบายว่า-C, --directory DIR\n change to directory DIR change output directory to DIR (will fail if DIR doesn't exist)ขอบคุณ @Mich ดูคำตอบของ @ Bryan_Larsen ด้วย
ใช้ได้ตั้งแต่

1
@Ujjwal Sing: จริง ๆ แล้วหน้า man tar นั้นไม่มีประโยชน์อะไรเลย มันอธิบาย "-C DIR" เป็น "เปลี่ยนเป็นไดเรกทอรี DIR" แย่ยิ่งกว่า: "tar -C mydir xf archive.tar" ไม่ทำงานในขณะที่ "tar xC archive.tar -C mydir" ทำงาน
Pat Morin

@PatMorin เพื่อความเป็นธรรมเมื่อคุณเข้าใจข้อโต้แย้งที่เรียกว่าการประชุมที่คุณใช้มันทำให้รู้สึก นอกจากนี้คุณยังสามารถทำหรือtar xfC archive.tar mydir tar -C mydir -xf archive.tarมันเป็นการผสมผสานธงแบบดั้งเดิมและรูปแบบ GNU เท่านั้นที่ทำลายสิ่งต่าง ๆ ตามที่ ... เป็นสิ่งที่คาดหวังอย่างแท้จริง ธงแบบดั้งเดิมจะถูกส่งผ่านทั้งหมดเป็นหนึ่งหยดเป็นอาร์กิวเมนต์แรก คุณไม่สามารถคาดหวังให้พวกเขาทำงานได้หากไม่ใช่คนแรก (ฉันหมายถึงใช่มันเป็นไปได้ที่จะตีความมันต่อไป - ประเด็นของฉันคือมันจะเกินกว่ามาตรฐานไม่ใช่)
Nic Hartley

คำตอบ:


958

ในการแยกไฟล์เก็บถาวรไปยังไดเรกทอรีที่แตกต่างจากปัจจุบันให้ใช้ตัวเลือก-Cหรือหรือ--directorytar เช่นใน

tar -xf archive.tar -C /target/directory

โปรดทราบว่าจะต้องมีไดเรกทอรีเป้าหมายก่อนเรียกใช้คำสั่งนั้น (สามารถสร้างได้โดยmkdir /target/directory)

อ่านหน้าคู่มือ (คำสั่ง:) man tarสำหรับตัวเลือกอื่น ๆ


สามารถแยกเส้นทาง: เช่นเพียงดึงไฟล์
zzapper

3
หากเป็นไฟล์ที่มีขนาดใหญ่กว่าเมื่อคุณเรียกใช้คำสั่งสิ่งที่คุณได้รับคือไม่มีเอาต์พุตเป็นเวลาหลายวินาทีหรือแม้แต่นาทีขณะที่มันกำลังทำงาน คุณสามารถแก้ไขได้โดยเพิ่ม-vแฟล็ก ( โหมด verbose ) ซึ่งแสดงรายการชื่อของแต่ละไฟล์ขณะที่แตกไฟล์
IQAndreas

หากคุณมีปัญหาในการใช้งานให้จด--strip-components=1คำแนะนำจากคำตอบอื่นด้วย
DreadPirateShawn


9
ไม่น่าแปลกใจเลยที่หลังจากที่มีตัวเลือกทั้งหมดtarสะสมไปแล้วหลายปีที่ผ่านมาก็ยังไม่มีตัวเลือกในการสร้างไดเรกทอรีผลลัพธ์ถ้ามันไม่มีอยู่จริง ?
EM0

260

โปรดทราบว่าหาก tarball ของคุณมีชื่อไดเรกทอรีที่คุณต้องการเปลี่ยนแล้วให้เพิ่ม--strip-components=1ตัวเลือก:

tar xf archive.tar -C /target/directory --strip-components=1

2
ขอขอบคุณ. การดาวน์โหลดผ่าน wget / etc จะมีไดเรกทอรี 'parent' อยู่เสมอ นี่เป็นคำตอบที่สมบูรณ์ - หรือควรระบุไว้ในคำตอบข้างต้น
bshea

สิ่งที่ฉันกำลังมองหา --strip-componentsมีประโยชน์มากเมื่อใช้งานตัวจัดเตรียมที่อาจใช้รุ่นอื่น วิธีนี้/target/directoryอาจเป็นชื่อสามัญโดยไม่ต้องกังวลว่าผู้ให้บริการจะเลือกตั้งชื่อโฟลเดอร์เก็บถาวรอย่างไร
Jack_Hu

30

การรวมคำตอบและความคิดเห็นก่อนหน้านี้:

หากต้องการแยกเนื้อหาและสร้างไดเรกทอรีเป้าหมายหากไม่มีอยู่ให้ทำดังนี้

mkdir -p /target/directory && tar xf archive.tar -C /target/directory

เพื่อแยกและลบไดเร็กทอรี root (ระดับแรก) ใน zip

mkdir -p /target/directory && tar xf archive.tar -C /target/directory --strip-components=1

20

อีกทางเลือกหนึ่งคือการใช้ - หนึ่งระดับบนสุด การทำเช่นนี้จะสร้างไดเรกทอรีโดยอัตโนมัติตามชื่อไฟล์ของต้นฉบับ

tar zxvf filename.tgz --one-top-level

นอกจากนี้หากคุณต้องการคุณสามารถระบุของคุณเองและน้ำมันดินจะสร้างขึ้นโดยอัตโนมัติ

tar zxvf filename.tgz --one-top-level=new_directory

3
ฉันใช้ GNU tar 1.26 และฉันได้รับข้อผิดพลาดของตัวเลือกที่ไม่รู้จักสำหรับ--one-top-level
Emma Strubell

นี่คือคำตอบที่ฉันต้องการ มีประโยชน์มาก "ไม่" ต้องระบุชื่อไดเรกทอรีหรือจำรหัสพิเศษที่จะอ้างอิงกลับไปที่ไฟล์สำหรับชื่อ ขอขอบคุณ.
Hypocritus

2

สิ่งที่ฉันคิดว่าน่าสนใจเกี่ยวกับการแตกไฟล์คือมันขึ้นอยู่กับวิธีที่คุณสร้างไฟล์เก็บถาวรดูตัวอย่างนี้

cd /tmp
mkdir folder
touch folder/file.txt

เมื่อคุณทำtar -zcvf folder.tar.gz folderทุกอย่างจะเป็นไปตามคาด = เมื่อคุณ Untar ตอนนี้มันจะเป็น untarred (โฟลเดอร์จะสร้างถ้าคุณถอดมันออก) /tmp/folder/ในฐานะ

แต่เมื่อคุณจะสร้าง tar เป็นtar -zcvf tmp-folder.tar.gz /tmp/folderและคุณ untar ในโฟลเดอร์ / tmp ผลจะเป็น/tmp/tmp/folderไดเรกทอรี! ในกรณีเช่นนี้คุณต้องยกเลิกการผูกติดกับ / -tar -xf tmp-folder.tar.gz -C /


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