Có thể chuyển đổi 7z sang tar trực tiếp không?


10

Tôi có một tệp .7z chứa ~ 360.000 hình ảnh trong nhiều thư mục. Tôi muốn chuyển đổi nó thành .tar để tôi có thể mở nó trong một máy tính khác. Có cách nào tốt hơn là trích xuất nó vào các tập tin và nén chúng lại không? Có thể thực hiện chuyển đổi trực tiếp?


8
Điều gì ngăn bạn mở .7ztệp trên máy tính khác?
Jordan

Tôi không có quyền quản trị trên đích để cài đặt 7z. Tôi biết tôi có thể cài đặt từ nguồn, v.v ...
Mohammad Moghimi

Câu trả lời:


8

Không quá khó để viết một cái gì đó để thực hiện công việc. Dưới đây là ví dụ về tập lệnh Perl (yêu cầu mô-đun Lưu trữ :: 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);

Nếu bạn muốn lưu trữ tar.gz / tar.bz2 / tar.xz, hãy thêm dòng archive_write_add_filter_gzip($out);hoặc archive_write_add_filter_bzip2($out);hoặc archive_tar_add_filter_xz($out);sau archive_write_set_formatdòng.

Điều này không sử dụng không gian đĩa tạm thời (chỉ là không gian cho tệp tar đầu ra) và rất ít RAM (chỉ vài MB cho perl, nhưng nó hoạt động với các tệp một khối tại một thời điểm, vì vậy không có vấn đề gì nếu tệp của bạn lớn hơn hơn RAM của bạn).


15

.7ztài liệu lưu trữ là tài liệu lưu trữ thường được nén với một số loại thuật toán, trong khi .tartài liệu lưu trữ chỉ là tài liệu lưu trữ.

Chúng khác nhau về phạm vi của chúng và trong hầu hết các trường hợp, một chuyển đổi sẽ yêu cầu giải nén tùy chọn luôn theo sau là trích xuất kho lưu trữ nguồn. Ngay cả khi một .7zkho lưu trữ sẽ không sử dụng bất kỳ nén nào, nó vẫn sẽ yêu cầu trích xuất.

Điều đó đang được nói, Nếu bạn có ý định [giải nén] / giải nén / tìm kiếm kho lưu trữ nguồn cùng một lúc, câu trả lời là bạn không thể, ít nhất là không sử dụng các công cụ mặc định của Ubuntu vì tarbạn không thể đọcstdin và vì vậy bạn không thể đọc 7ztar. Dù sao, rất dễ dàng để tự động hóa mọi thứ trong một lệnh:

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

* <path_to_archive> = đường dẫn đến .7zkho lưu trữ nguồn

Ngoài ra thời gian cần thiết cho các tập tin nén nguồn để được ghi vào đĩa và cho các file trích xuất để được đọc để [giải nén] / trích xuất / rearchive các kho lưu trữ nguồn theo hai bước là một nút cổ chai cho toàn bộ nhiệm vụ chủ yếu (altough không chỉ) do tốc độ I / O thấp của một ổ đĩa tiềm năng, do đó, một giải pháp một phần sẽ là lưu trữ các tệp tạm thời vào một đĩa ram để gần như vô hiệu hóa nút cổ chai chung:

  1. Tạo điểm gắn kết cho hệ thống tập tin của ramdisk: sudo mkdir /mnt/tmpfs
  2. Gắn hệ thống tệp của ramdisk: sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk* <tmpfs_size> = kích thước của hệ thống tệp theo byte * 10 3 (1, 1K, 1M, 1G, ...)
  3. Chạy 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> = đường dẫn đến .7zkho lưu trữ nguồn
  4. Ngắt kết nối hệ thống tập tin của ramdisk: sudo umount
  5. Xóa điểm gắn kết cho hệ thống tệp của ramdisk: sudo rmdir /mnt/tmpfs

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Mitch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.