tar แตกในไดเรกทอรีที่มีชื่อฐานเดียวกันหรือไม่


18

ผมมีไฟล์ ziped myArchive123.tar.gzเช่น ข้างในมีโฟลเดอร์เหมือนhelloWorld

ถ้าฉันแยกมัน: tar -xf myArchive123.tar.gzฉันได้รับhelloWorldโฟลเดอร์:

ls 
myArchive123.tar.gz
helloWorld 

ฉันต้องการให้ผลลัพธ์เป็นชื่อเดียวกับชื่อไฟล์ลบด้วยนามสกุล. tar.gz เช่น:

tar <magic paramaters> myArchive123.tar.gz 
ls 
 myArchive123.tar.gz
 myArchive123
cd myArchive123
ls 
  helloWorld

สามารถทำได้หรือไม่

  • ฉันไม่เคยรู้ว่ามีอะไรอยู่ในคลัง อาจเป็นโฟลเดอร์ได้หลายไฟล์
  • ฉันจะโอเคกับเครื่องมืออื่นถ้า tar ไม่สามารถทำได้
  • ฉันจะโอเคกับฟอร์มที่ยาวขึ้นซึ่งสามารถเปลี่ยนเป็นสคริปต์ได้

แก้ไข
ในขณะที่ฉันแฮ็คสคริปต์ที่ดูเหมือนว่าจะทำให้งานเสร็จ (ดูคำตอบที่โพสต์ของฉันด้านล่าง) หากสามารถปรับปรุงได้โปรดโพสต์ความคิดเห็น / คำตอบเพิ่มเติม สิ่งสำคัญคือมันควรจะบรรจุลงในหนึ่งซับเหมือน:

extract <file>

1
ไฟล์เก็บถาวรมีหนึ่งโฟลเดอร์ใช่หรือไม่?
Mark Plotnick


ฉันไม่รู้ว่ามีอะไรอยู่ข้างในเวลาที่แยก สิ่งนี้ไม่ควรขึ้นอยู่กับสิ่งที่อยู่ภายในไฟล์เก็บถาวร หากเป็นโฟลเดอร์ให้แตกโฟลเดอร์ออกมา ถ้าเป็นไฟล์ให้แตกไฟล์ทั้งหมด
Leo Ufimtsev

ในระหว่างนี้ฉันได้รวมสคริปต์ไว้ด้วยกัน (ดูด้านล่าง) ฉันยอมรับคำตอบได้ใน 2 วันเท่านั้น
Leo Ufimtsev

ไฟล์เก็บถาวรจะมีโฟลเดอร์มากกว่าหนึ่งโฟลเดอร์ที่ระดับสูงสุดหรือไม่?
Mark Plotnick

คำตอบ:


10

ด้วยgnu tarคุณสามารถใช้--xform(หรือ--transform) เพื่อเติม/prefix/ชื่อไฟล์แต่ละชื่อ:

tar -xf myArchive.tar.gz --xform='s|^|myArchive/|S'

ทราบมีไม่มีชั้นนำ/ในprefix/และsedแสดงออกปลายด้วยSที่จะไม่รวมเป้าหมายการเชื่อมโยงสัญลักษณ์จากการแปลงชื่อไฟล์
เพื่อทดสอบ (แห้ง):

tar -tf myArchive.tar.gz --xform='s|^|myArchive/|S' --verbose --show-transformed-names

เพื่อให้คุณเริ่มต้นได้นี่เป็นสคริปต์ที่ง่ายมากที่คุณสามารถเรียกใช้เป็นextract <file>:

STRIP = $ {1%. *} #strip ส่วนต่อท้ายสุดท้าย
NAME = $ {STRIP% .tar} #strip .tarต่อท้ายหากมี
tar -xf "$ 1" --xform = "s | ^ | $ NAME / | S" คำสั่ง #run

นี่ใกล้เคียงกับสิ่งที่ฉันต้องการยกเว้นว่าฉันต้องการที่จะสามารถบรรจุลงในบางสิ่งเช่น: แยก <file>
Leo Ufimtsev

นี่เป็นรถมันหยุดที่จุดแรก เช่นฉันมีไฟล์เช่นนี้: eclipse-SDK-4.5M6-linux-gtk-x86_64.tar.gz ฉันคาดหวังผลลัพธ์โดยไม่มี. tar.gz แต่ฉันได้รับ eclipse-sdk-4
Leo Ufimtsev

ในสคริปต์ด้านบนฉันจะดึงส่วนขยายและตัดออกไปอีกถ้าพบ 'tar'
Leo Ufimtsev

โดยทั่วไปแล้วมีจดหมายเหตุหลายประเภท ฉันหวังว่าจะเป็นสายการบินเดียวที่รวดเร็วฉันคิดว่าบางทีฉันอาจพลาดการโต้เถียง แต่ดูเหมือนว่าจะไม่มีวิธีแก้ปัญหาเล็กน้อยสำหรับเรื่องนี้?
Leo Ufimtsev

สิ่งที่ดี. ใช้งานได้และสั้นกว่าสคริปต์ที่ฉันเขียน ดี!
Leo Ufimtsev

7

อย่างน้อยคุณสามารถทำได้ในไม่กี่ขั้นตอนอย่างน้อย ถ้าคุณทำ

mkdir <archive name>
tar -xf <archive name>.tar.gz --strip-components=1 -C <archive name>

ที่จะทำงานให้สำเร็จแม้ว่าอาจจะมีคำตอบที่กระชับกว่านั้น


3

แก้ไข

คำตอบที่ยอมรับนั้นสั้นกว่าด้านล่าง (ทำสิ่งเดียวกัน แต่สั้นกว่ามักจะดีกว่า)


ในที่สุดฉันก็แฮ็คสคริปต์ตัวเองสำหรับงานที่กำลังทำอยู่ มันทำงานร่วมกับ. tar .tar.gz และ. gz

#!/bin/sh
#usage:
# nameOfScript myArchive.tar.gz
# nameOfScript myArchive.gz
# nameOfScript myArchive.tar
#
# Result:
# myArchive   //folder
fileName="${1%.*}" #extracted filename

#handle the case of archive.tar.gz
trailingExtension="${fileName##*.}"
if [ "$trailingExtension" == "tar" ]  
then
    fileName="${fileName%.*}"  #remove trailing  tar.
fi

mkdir "$fileName"
tar -xf "$1" --strip-components=0 -C "$fileName"

การใช้งาน:

   nameOfScript archive.tar.gz 
   ls 
    archive
   cd archive 
   ls 
    <archive content>

หมายเหตุวิธีนี้มีความสามารถในการจุดในชื่อไฟล์ เช่น Eclipse-4.5M-SDK.tar.gz

ฉันเก็บสคริปต์ไว้ใน repo คอมไพล์ของฉัน สำหรับรุ่นล่าสุดโปรดดู: https://github.com/LeoUfimtsev/ldts/blob/master/pathscripts/leo-tar-here


2

อีกวิธีหนึ่งที่เป็นไปได้คือการใช้--transformตัวเลือก:

tar -xzf ARCHIVE_NAME.tgz --transform="s/OLD_DIR_NAME/ARCHIVE_NAME/"

ด้วยไฟล์ของคุณ:

tar -xzf myArchive123.tar.gz --transform="s/helloWorld/myArchive123/"

1
แต่สิ่งนี้คาดเดาล่วงหน้าว่าคุณรู้ว่ามีอะไรอยู่ในคลังข้อมูล
Leo Ufimtsev

เช่นฉันจะแปลงเป็นสคริปต์บรรทัดเดียวโดยไม่ทราบว่ามีอะไรอยู่ในไฟล์เก็บถาวร
Leo Ufimtsev

คุณถูกต้อง มันเป็นเพียงหนึ่งในทางออกที่เป็นไปตามที่ผมเขียนไว้ที่นี่ ...
SVQ

มีความแตกต่างระหว่างนั้นและ --strip-compoments = 0 myArchive123 หรือไม่?
Leo Ufimtsev

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