untar เพียงไฟล์จำนวนหนึ่งจาก tarball ขนาดใหญ่


12

ฉันมี tarball ขนาดใหญ่ที่กำลังยุ่งกับ FTP'd จากระบบรีโมตไปยังระบบโลคอลของเรา

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

คำตอบ:


12

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

ตัวอย่างเช่น:

tar --extract --file={tarball.tar} {file}

นอกจากนี้คุณยังสามารถแยกไฟล์เหล่านั้นที่ตรงกับรูปแบบ globbing เฉพาะ (ตัวแทน) ตัวอย่างเช่นหากต้องการแยกไฟล์จาก cbz.tar ทุกไฟล์ที่ขึ้นต้นด้วย pic ไม่ว่าจะใส่คำนำหน้าไดเรกทอรีคุณสามารถพิมพ์:

tar -xf cbz.tar --wildcards --no-anchored 'pic*'

หากต้องการแตกไฟล์ php ทั้งหมดให้ป้อน:

tar -xf cbz.tar --wildcards --no-anchored '*.php'

ที่ไหน

-x: สั่ง tar เพื่อแยกไฟล์
-f: ระบุชื่อไฟล์ / ชื่อ tarball
-v: Verbose (แสดงความคืบหน้าขณะทำการแตกไฟล์)
-j: ตัวกรองเก็บถาวรผ่าน bzip2 ใช้เพื่อขยายไฟล์. bz2
-z: ตัวกรองเก็บถาวรผ่าน gzip ใช้เพื่อขยายไฟล์. gz
--wildcards: สั่งให้ tar รักษาอาร์กิวเมนต์บรรทัดคำสั่งเป็นรูปแบบกลม
--no-anchored: แจ้งว่ารูปแบบนี้ใช้กับชื่อสมาชิกหลัง / ตัวคั่นใด ๆ


3
ฉันไม่ต้องการที่จะแยกไฟล์ที่เฉพาะเจาะจง ฉันต้องการแตกไฟล์ 50 ไฟล์แรกเพราะไม่รู้ว่าชื่อไฟล์คืออะไร
Pieter van Niekerk

4
คุณสามารถรับรายการชื่อไฟล์โดยใช้ "tar -tf" ใช้ 50 ชื่อแรกโดยใช้ "head" จากนั้นป้อนรายการนั้นลงในคำสั่ง tar อื่นเป็นรายการชื่อไฟล์ที่ต้องการแตก เช่นนี้: "tar -xf file.tar - no-anchored` tar -tf file.tar | head -50` "
Simon Hibbs

มันค่อนข้างเป็นไปได้ (ในการทดสอบของฉัน) เพื่อแยกไฟล์ 50 trandferred บางส่วน .. มันจะเป็นความคิดที่ดีที่จะหลีกเลี่ยงการแยกไฟล์สุดท้าย (ปัจจุบัน) ใน-tรายการจนกว่า tarball จะถูกดาวน์โหลดอย่างสมบูรณ์ ณ เวลาใดเวลาหนึ่งรายการจะแสดงชื่อไฟล์ที่ถูกถ่ายโอนหรือถูกโอนย้ายเท่านั้น ไม่เต็มรูปแบบรายการ; จนกว่าจะดาวน์โหลดอย่างเต็มที่
Peter.O

2

ไม่ได้ลองด้วยตัวเอง แต่ลองทำสิ่งนี้:

tar xvf archive.tar | head -n50

Tar ส่งเอาต์พุตบรรทัดไปที่ STDOUT สำหรับแต่ละไฟล์ที่แยกแล้วheadคำสั่งจะฆ่าไพพ์หลังจาก 50 บรรทัด เมื่อท่อกำลังจะตายฉันคาดว่าน้ำมันดินจะตายเช่นกัน


headขออภัยที่ควรจะได้รับแน่นอน ให้ฉันเปลี่ยนคำตอบ
jippie

ฉันไม่ได้ตรวจสอบ แต่ฉันกลัวว่าเนื่องจากบัฟเฟอร์ไปป์tarอาจแยกไฟล์มากกว่า 50 ไฟล์ก่อนที่จะเป็น SIGPIPEd และโดยเฉพาะอย่างยิ่งไฟล์อาจแตกไฟล์สุดท้ายที่ไม่สมบูรณ์
Gilles 'หยุดความชั่วร้าย'

2
tar -tvf tarfile.tar

ให้รายชื่อไฟล์ทั้งหมดแก่คุณ tarfile.tar

tar -xvf tarfile.tar fileToRestore  

คำสั่งนี้จะกู้คืน fileToRestore

หากต้องการ untar หลายไฟล์ แต่ไม่สามารถทำได้ทั้งหมด:

  • คุณใส่รายชื่อไฟล์ทั้งหมดtarfile.tarลงในtar.txt

    tar -tvf tarfile.tar > tar.txt
    
  • ตอนนี้tar.txtมีรายชื่อไฟล์ทั้งหมดtarfile.tar และคุณสามารถทิ้งเฉพาะไฟล์ที่คุณต้องการกู้คืนหรือด้วย ...

    head -n50 tar.txt > tar2.txt
    

คุณสามารถใส่บรรทัดเหล่านี้ลงในไฟล์

cat tar.txt|while read line
do
   tar -xvf tarfile.tar ${line}
done

หรือไฟล์สคริปต์ที่สมบูรณ์:

#!/bin/bash

if [[ "$1" = "" || "$2" = "" ]]
   then
   echo ""
   echo "Uso: untar-list.sh tarfile.tar listfile.txt"
   echo ""
   exit 1
fi

tarfile=$1
file=$2

if [[ ! -f ${tarfile} ]]
   then
   echo ""
   echo "Archivo ${tarfile} no existe"
   echo ""
   exit 1
fi

if [[ ! -f ${file} ]]
   then
   echo ""
   echo "Archivo ${file} no existe"
   echo ""
   exit 1
fi

cat ${file}|while read line
do
  tar -xvf ${tarfile} ${line}
done

echo ""
echo "Finalizado"
echo ""

และนั่นคือทั้งหมดที่


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