Birden fazla dizinde ~ 360.000 görüntü içeren bir .7z dosyam var. Başka bir bilgisayarda açabilmek için .tar biçimine dönüştürmek istiyorum. Dosyalara ayıklamak ve tekrar sıkıştırmaktan daha iyi bir yol var mı? Dönüşümü doğrudan yapmak mümkün müdür?
Birden fazla dizinde ~ 360.000 görüntü içeren bir .7z dosyam var. Başka bir bilgisayarda açabilmek için .tar biçimine dönüştürmek istiyorum. Dosyalara ayıklamak ve tekrar sıkıştırmaktan daha iyi bir yol var mı? Dönüşümü doğrudan yapmak mümkün müdür?
Yanıtlar:
İşi yapmak için bir şeyler yazmak çok zor değil. Örnek bir Perl betiği ( Archive :: Libarchive :: XS modülünü gerektirir ).
#!/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);
Eğer bir tar.gz / tar.bz2 / tar.xz arşiv eklemek çizgi isteseydim archive_write_add_filter_gzip($out);
ya archive_write_add_filter_bzip2($out);
ya archive_tar_add_filter_xz($out);
sonra archive_write_set_format
hat.
Bu, geçici disk alanı (yalnızca çıktı tar dosyası için alan) ve çok az RAM (perl için sadece birkaç MB kullanır, ancak dosyalar ile bir seferde bir blok halinde çalışır, bu nedenle dosyalarınız daha büyükse sorun değildir RAM'inizden).
.7z
arşivler genellikle bir tür algoritma ile sıkıştırılmış .tar
arşivlerdir, arşivler ise sadece arşivlerdir.
Kapsamları farklıdır ve çoğu durumda bir dönüşüm her zaman isteğe bağlı bir dekompresyon gerektirir ve ardından her zaman kaynak arşivin çıkarılması gerekir. Bir .7z
arşiv herhangi bir sıkıştırma kullanmasa bile, yine de çıkarılması gerekir.
Eğer [kaldırmakta] / özü amaçladıysanız Bu varlık dedi / kerede kaynak arşivini REArşiv, cevap çünkü, en azından Ubuntu'nun varsayılan araçlarını kullanarak değil olamaz tar
okuma yapamıyorstdin
böylece boru olamaz, 7z
ve tar
. Her neyse, tek bir komutla her şeyi otomatikleştirmek çok kolaydır:
mkdir tmp && 7z x <path_to_source_archive> -otmp && tar cf archive.tar tmp && rm -rf tmp
* <path_to_archive> = kaynak .7z
arşivi yolu
Ayrıca, kaynak arşivi dosyalarının diske yazılması ve kaynak arşivi iki adımda [sıkıştırmasını açmak / ayıklamak / yeniden aramak için okunan dosyaların okunması için gereken süre çoğunlukla tüm görev için bir darboğazdır ( yalnızca) potansiyel bir diskin düşük G / Ç hızından dolayı, kısmi bir çözüm, genel darboğazın neredeyse tamamen ortadan kaldırılması için geçici dosyaların ramdisk'e depolanması olacaktır:
sudo mkdir /mnt/tmpfs
sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk
* <tmpfs_size> = dosya sisteminin bayt cinsinden boyutu * 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> = kaynak .7z
arşivi yolusudo umount
sudo rmdir /mnt/tmpfs
.7z
Dosyayı başka bir bilgisayarda açmanızı engelleyen nedir ?