ฉันมีไฟล์. 7z ที่มี ~ 360,000 ภาพในหลายไดเรกทอรี ฉันต้องการแปลงเป็น. tar เพื่อให้สามารถเปิดในคอมพิวเตอร์เครื่องอื่นได้ มีวิธีที่ดีกว่าการแตกไฟล์และบีบอัดไฟล์อีกครั้งหรือไม่? เป็นไปได้ไหมที่จะทำการแปลงโดยตรง
ฉันมีไฟล์. 7z ที่มี ~ 360,000 ภาพในหลายไดเรกทอรี ฉันต้องการแปลงเป็น. tar เพื่อให้สามารถเปิดในคอมพิวเตอร์เครื่องอื่นได้ มีวิธีที่ดีกว่าการแตกไฟล์และบีบอัดไฟล์อีกครั้งหรือไม่? เป็นไปได้ไหมที่จะทำการแปลงโดยตรง
คำตอบ:
การเขียนบางสิ่งเพื่อทำงานนั้นไม่ยากเกินไป นี่เป็นตัวอย่างสคริปต์ 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 ของคุณ)
.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 เพื่อที่จะทำให้คอขวดโดยรวมเกือบเป็นโมฆะ:
sudo mkdir /mnt/tmpfs
sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk
* <tmpfs_size> = ขนาดของระบบไฟล์เป็นไบต์ * 10 3 (1, 1K, 1M, 1G, ... )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
เก็บถาวรต้นฉบับsudo umount
sudo rmdir /mnt/tmpfs
.7z
ไฟล์บนคอมพิวเตอร์เครื่องอื่นได้?