เป็นไปได้ไหมที่จะแปลง 7z เป็น tar โดยตรง?


10

ฉันมีไฟล์. 7z ที่มี ~ 360,000 ภาพในหลายไดเรกทอรี ฉันต้องการแปลงเป็น. tar เพื่อให้สามารถเปิดในคอมพิวเตอร์เครื่องอื่นได้ มีวิธีที่ดีกว่าการแตกไฟล์และบีบอัดไฟล์อีกครั้งหรือไม่? เป็นไปได้ไหมที่จะทำการแปลงโดยตรง


8
อะไรทำให้คุณไม่สามารถเปิด.7zไฟล์บนคอมพิวเตอร์เครื่องอื่นได้?
จอร์แดน

ฉันไม่มีสิทธิ์ของผู้ดูแลระบบในปลายทางเพื่อติดตั้ง 7z ฉันรู้ว่าฉันสามารถติดตั้งจากแหล่ง ฯลฯ ...
โมฮัมหมัด Moghimi

คำตอบ:


8

การเขียนบางสิ่งเพื่อทำงานนั้นไม่ยากเกินไป นี่เป็นตัวอย่างสคริปต์ Perl (ต้องการโมดูลArchive :: Libarchive :: XS )

#!/usr/bin/perl
use strict;
use warnings;
use Archive::Libarchive::XS qw(:all);

die "Usage: $0 in.7z out.tar" unless @ARGV == 2;
my ($infile, $outfile) = @ARGV;

my $in = archive_read_new();
archive_read_support_filter_none($in);
archive_read_support_format_7zip($in);

archive_read_open_filename($in, $infile, 10240) == ARCHIVE_OK
  or die "Error opening $infile: ", archive_error_string($in);

my $out = archive_write_new();
archive_write_set_format_ustar($out);
archive_write_open_filename($out, $outfile) == ARCHIVE_OK
  or die "Error opening $outfile: ", archive_error_string($out);

while (archive_read_next_header($in, my $entry) == ARCHIVE_OK) {
  archive_write_header($out, $entry) == ARCHIVE_OK
    or die archive_error_string($out);
  while (1) {
    my $size = archive_read_data($in, my $buff, 65536);
    die archive_error_string($in) if $size < 0; 
    last if $size == 0;
    archive_write_data($out, $buff) >= 0
      or die archive_error_string($out);
  }
} 

archive_read_free($in);
archive_write_close($out);
archive_write_free($out);

หากคุณต้องการเก็บถาวร tar.gz / tar.bz2 / tar.xz ให้เพิ่มบรรทัดarchive_write_add_filter_gzip($out);หรือarchive_write_add_filter_bzip2($out);หรือarchive_tar_add_filter_xz($out);หลังarchive_write_set_formatบรรทัด

สิ่งนี้ใช้พื้นที่ดิสก์ไม่ชั่วคราว (เพียงแค่พื้นที่ว่างสำหรับไฟล์ output tar) และ RAM น้อยมาก (เพียงไม่กี่ MB สำหรับ perl แต่ทำงานได้กับไฟล์บล็อกในแต่ละครั้งดังนั้นจึงไม่ใช่ปัญหาหากไฟล์ของคุณมีขนาดใหญ่กว่า กว่า RAM ของคุณ)


15

.7zจดหมายเหตุเป็นจดหมายเหตุมักจะถูกบีบอัดด้วยอัลกอริทึมบางประเภทในขณะที่.tarจดหมายเหตุเป็นเพียงจดหมายเหตุ

พวกเขาแตกต่างกันในขอบเขตของพวกเขาและในกรณีส่วนใหญ่การแปลงจะต้องมีการบีบอัดตัวเลือกตามมาด้วยการแยกของที่เก็บถาวรแหล่งที่มา แม้ว่า.7zไฟล์เก็บถาวรจะไม่ใช้การบีบอัดใด ๆ แต่ก็ยังต้องการการแยกไฟล์

ที่ถูกกล่าวว่าหากคุณต้องการ [decompress] / แยก / rearchive แหล่งที่เก็บถาวรในครั้งเดียวคำตอบคือคุณไม่สามารถอย่างน้อยไม่ใช้เครื่องมือเริ่มต้นของ Ubuntu เพราะtarไม่สามารถอ่านได้stdinดังนั้นคุณจึงไม่สามารถไป7zและtar. อย่างไรก็ตามมันง่ายมากที่จะทำให้ทุกอย่างเป็นอัตโนมัติในคำสั่งเดียว:

mkdir tmp && 7z x <path_to_source_archive> -otmp && tar cf archive.tar tmp && rm -rf tmp

* <path_to_archive> = พา ธ ไปยังแหล่ง.7zเก็บถาวร

นอกจากนี้เวลาที่จำเป็นสำหรับไฟล์ที่เก็บแหล่งที่จะถูกเขียนไปยังดิสก์และสำหรับแฟ้มที่แยกที่จะอ่านเพื่อ [ขยาย] / สารสกัด / rearchive เก็บแหล่งที่มาในขั้นตอนที่สองเป็นคอขวดสำหรับงานทั้งส่วนใหญ่ (ได้แม้ว่าไม่ได้ เท่านั้น) เนื่องจากความเร็ว I / O ต่ำของดิสก์ที่อาจเกิดขึ้นดังนั้นโซลูชันบางส่วนจะเก็บไฟล์ชั่วคราวไว้ใน ramdisk เพื่อที่จะทำให้คอขวดโดยรวมเกือบเป็นโมฆะ:

  1. สร้างจุดเชื่อมต่อสำหรับระบบไฟล์ของ ramdisk: sudo mkdir /mnt/tmpfs
  2. เมานต์ระบบไฟล์ของ ramdisk: sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk* <tmpfs_size> = ขนาดของระบบไฟล์เป็นไบต์ * 10 3 (1, 1K, 1M, 1G, ... )
  3. รันmkdir /mnt/tmpfs/tmp && 7z x <path_to_source_archive> -o/mnt/tmpfs/tmp && tar cf archive.tar /mnt/tmpfs/tmp && rm -rf /mnt/tmpfs/tmp* <path_to_archive> = พา ธ ไปยังที่.7zเก็บถาวรต้นฉบับ
  4. ถอนติดตั้งระบบไฟล์ของ ramdisk: sudo umount
  5. ลบจุดเมานท์สำหรับระบบไฟล์ของ ramdisk: sudo rmdir /mnt/tmpfs

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