ฉันจะสร้างไฟล์ tar ตามลำดับตัวอักษรได้อย่างไร


22

ฉันต้องการสร้างไฟล์ tar ที่มีการประมวลผลไดเรกทอรีและไฟล์ทั้งหมดตามลำดับตัวอักษร นี่เป็นลำดับชั้นของไดเรกทอรีทั้งหมดที่ถูก tarred ดังนั้นมันจะเริ่มต้นด้วยการประมวลผลไดเรกทอรีแรกตามลำดับตัวอักษรและจากนั้นไดเรกทอรีย่อยในนั้นมีตัวอักษร ฯลฯ ฉันดูผ่านหน้า man และไม่พบสวิตช์สำหรับสิ่งนี้

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


2
ทำไมคุณถึงต้องการทำเช่นนี้?
matthias krull

ส่วนใหญ่เป็นเพราะฉันต้องการทราบว่าการดำเนินการ tar เสร็จสมบูรณ์เพียงใด เมื่อไฟล์กำลังโหลดตามลำดับแบบสุ่มจะไม่มีวิธีบอกด้วยแฟล็ก -v
Erick Robertson

2
นั่นไม่จริงทั้งหมด หากคุณไพพ์เอาต์พุตไปยังไฟล์และทราบจำนวนไฟล์ (พูดคำสั่ง quick find) คุณสามารถเปรียบเทียบเอาต์พุต -v (wc -l) กับจำนวนไฟล์จาก find เพื่อรับความคืบหน้า ...
Slartibartfast

2
@matthiaskrull ฉันมีเหตุผลที่ไม่เกี่ยวข้องกับเรื่องนี้ฉันกำลังสร้างไฟล์ OVA (ซึ่งเป็นไฟล์ tar) สำหรับการปรับใช้ VM บน VMWare ESX Server OVA ต้องการไฟล์ตามลำดับเฉพาะภายในไฟล์ (ไฟล์แรกควรเป็น OVF และอื่น ๆ )
xask

1
นอกจากนี้ยังมีเหตุผลที่ดีสำหรับสิ่งนี้: ประสิทธิภาพในไฟล์ที่มีขนาดใหญ่มากเมื่อคุณต้องการแยกเพียงบางส่วน เนื่องจากคำสั่งนั้นสุ่มโดยค่าเริ่มต้นและคุณต้องการแยกไฟล์ / ไดเรกทอรีหากคำสั่งนั้นจะเร็วขึ้นหากไม่ได้มันจะต้องสแกนไฟล์เก็บถาวรทั้งหมดก่อนที่จะรู้ว่ามันเสร็จสิ้นแล้ว
StormByte

คำตอบ:


12

Slartibartfast อยู่ในเส้นทางที่ถูกต้อง แต่พฤติกรรมเริ่มต้นของ tar คือการสืบสู่ไดเรกทอรีดังนั้นคุณอาจได้รับมากกว่าหนึ่งสำเนาของไฟล์เดียวกันที่รวมอยู่ในไฟล์ tar ที่สร้างขึ้น คุณสามารถตรวจสอบโดยการทำ tar tf file.tar | sort วิธีแก้ปัญหาคือการรวมตัวเลือก --no-recursion เพื่อ tar นอกจากนี้คุณควรสามารถส่งชื่อไฟล์แปลก ๆ โดยใช้ -print0 ตัวเลือกในการค้นหาจากนั้นใช้--nullตัวเลือกเพื่อ tar ผลลัพธ์ที่ได้จะเป็นดังนี้:

find paths -print0 | sort -z | tar cf tarfile.tar --no-recursion --null -T -

คุณสามารถตรวจสอบการสั่งซื้อในไฟล์ tar tar tsf tarfile.tarโดยใช้ แม้ว่าคุณจะไม่จำเป็นต้องใช้ตัวเลือก -print0, -z และ --null เว้นแต่คุณจะรู้ว่าคุณจะต้องเจอชื่อไฟล์ที่มีบรรทัดใหม่ฝังอยู่ แต่ฉันไม่เคยลองเลย


ข้อเสนอแนะที่ยอดเยี่ยมสำหรับการใช้ตัวเลือก - ไม่มีการเรียกซ้ำขอบคุณ
Erik

นี่คือทางออกที่ได้ผลสำหรับฉัน ฉันมีกรณีการใช้งานที่แตกต่างจาก Erick และ Google นำมาให้ฉันที่นี่ ฉันกำลังรวบรวมสแนปชอตในช่วงเวลาที่สถานะสมบูรณ์ของระบบรีโมต ข้อมูลซ้ำซ้อนสูง การเรียงลำดับอินพุต tar ตามเวลา (ชื่อไฟล์มีการประทับเวลา) ช่วยปรับปรุงประสิทธิภาพของคอมเพรสเซอร์ การทดสอบอย่างรวดเร็วแสดงให้เห็นถึงการปรับปรุงโดยปัจจัยที่ 2 (lzma2) นอกจากนี้ฉันไม่ได้แยกไฟล์เก็บถาวรลงในระบบไฟล์ แต่จะประมวลผลสตรีมผ่านรายการ tar สตรีมที่เรียงลำดับจะสร้างเอาต์พุตการดีบักที่ดีกว่าและมีประโยชน์อื่น ๆ ในห่วงโซ่กระบวนการ +1
โยฮันเนส

5

ลำดับของไฟล์ภายในไฟล์ tar นั้นไม่สำคัญเนื่องจากเมื่อแตกไฟล์แล้วระบบไฟล์จะไม่รักษาลำดับไว้

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

% tar cf tarfile tmp/diff.txt src/hellow.c junkimage.IMG barry/thegroup
% tar tf tarfile
tmp/diff.txt
src/hellow.c
junkimage.IMG
barry/thegroup

2
หรือเพียงเรียงลำดับผลลัพธ์:tar tf tarfile | sort
Doug Harris

ฉันมีไฟล์มากเกินไป (20,000+) เพื่อระบุไฟล์ทั้งหมดในบรรทัดคำสั่ง
Erick Robertson

4
ลำดับของไฟล์ภายในไฟล์ tar นั้นมีความสำคัญหากคุณต้องการคลายการบีบอัดและแสดงผลขณะดาวน์โหลด
Erik

ขึ้นอยู่กับระบบไฟล์
Thorbjørn Ravn Andersen

4

สมมติว่าคุณไม่มีไฟล์ใด ๆ ที่มีบรรทัดใหม่ในชื่อ:

find /source_directory -print | sort | tar -czf target.tgz -T -

หากไม่ได้ผล (ไม่เคยลองเลยฉันไม่รู้ - หมายถึง stdin สำหรับอาร์กิวเมนต์ -T):

find /source_directory -print | sort > /tmp/temporary_file_list
tar -czf target.tgz -T /tmp/temporary_file_list

แล้วมีคำถามว่าทำไม แต่บางครั้งก็ง่ายกว่าที่จะไม่ถาม


2
find . -depth -print0 | sort -z | pax -wvd0 > file.tar

สันติภาพเป็นประเภทที่สืบต่อจาก POSIX ไปจนถึง cpio และ tar และประเภทของฟิวส์ที่ดีที่สุดของทั้งสอง มันเขียนเก็บถาวร tar (ustar) โดยค่าเริ่มต้น นอกจากนี้ยังทำการขยายและแสดงสื่อโดยอัตโนมัติและพิมพ์ข้อมูลสรุปเมื่อเสร็จสิ้น


0

ทางเลือกอื่นสำหรับคำตอบของ @ CharlieHerron หากคุณสนใจที่จะสงวนเนื้อหา (ไฟล์ symlink) และ meta-data ของโฟลเดอร์ (เช่นการอนุญาตโฟลเดอร์ mtime ฯลฯ ) คุณอาจต้องการกรองโฟลเดอร์ออกจากfindผลลัพธ์

find paths -not -type d -print 0 | sort -z | tar cf tarfile.tar --null -T -
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.