Tạo tar.xz trong một lệnh


159

Tôi đang cố gắng tạo một .tar.xzkho lưu trữ nén trong một lệnh. Cú pháp cụ thể cho điều đó là gì?

Tôi đã thử tar cf - file | xz file.tar.xz, nhưng nó không hoạt động.

Câu trả lời:


241

Sử dụng -Jtùy chọn nén cho xz. Và nhớ man tar:)

tar cfJ <archive.tar.xz> <files>

Chỉnh sửa 2015-08-10:

Nếu bạn chuyển các đối số sang tar dấu gạch ngang (ví dụ: tar -cftrái ngược với tar cf), thì -ftùy chọn phải đến sau cùng , vì nó chỉ định tên tệp (cảm ơn @ABB vì đã chỉ ra điều đó!). Trong trường hợp đó, lệnh trông giống như:

tar -cJf <archive.tar.xz> <files>

5
thêm vvào lệnh switch ( tar -cJvf) để dài dòng cho thấy các tệp được thêm vào kho lưu trữ.
Stuart Cardall

7
Với thứ tự là quan trọng với dấu gạch ngang, có lẽ tốt nhất là giả định thứ tự luôn luôn quan trọng và đặt fcuối cùng, ngay cả khi không có dấu gạch ngang.
mwfearnley

1
Có thể truyền tham số xz như -e (--extends) không? Rõ ràng nó sẽ không sử dụng mở rộng theo mặc định.
chmike

3
tartrên macOS dường như hỗ trợ -Jnhưng tính năng này không được cung cấp trong trang man. Phải tìm nó ở đây. Mặc dù họ có đề cập đến XZ trong phần trên --options...
cbarrick

1
@chmike Sử dụng biến môi trường XZ_OPT. Ví dụ: XZ_OPT = "- 9e -T0".
Dzenly

50

Switch -Jchỉ hoạt động trên các hệ thống mới hơn. Lệnh phổ quát là:

Để thực hiện lưu trữ .tar.xz

tar cf - directory/ | xz -z - > directory.tar.xz

Giải trình

  1. tar cf - directoryđọc thư mục / và bắt đầu đặt nó ở định dạng TAR. Đầu ra của hoạt động này được tạo ra trên đầu ra tiêu chuẩn.

  2. | ống đầu ra tiêu chuẩn đến đầu vào của một chương trình khác ...

  3. ... Điều đó xảy ra xz -z -. XZ được cấu hình để nén ( -z) lưu trữ từ đầu vào tiêu chuẩn ( -).

  4. Bạn chuyển hướng đầu ra từ xzvào tar.xztập tin.


16
-fkhông có nghĩa là "từ tập tin" khi được chuyển đến xz. Thay vào đó, nó là viết tắt của --force(xem xz (1) để biết chi tiết) và tốt nhất là không được sử dụng trừ khi cần thiết.
Eliah Kagan

@EliahKagan Đã sửa. Cảm ơn.
Wojciech Adam Koszek

2
Để sử dụng nén đa luồng, tùy chọn -T0 có thể được sử dụng:tar cf - directory/ | xz -z -T0 - > directory.tar.xz
oidualc

Một ưu điểm khác là bạn có thể dễ dàng chỉ định mức nén hoặc bất kỳ tùy chọn nào khác cho xz trên dòng lệnh. Ví dụ: nếu bạn muốn tăng tốc độ nén và không quan tâm nhiều đến kích thước bạn có thể sử dụng -1 -T0hoặc -0 -T0dưới dạng tùy chọn, thông thường sẽ vẫn cung cấp cho bạn một tệp nhỏ hơn gzip trong thời gian tương đương hoặc nhanh hơn, trong khi mặc định -6chậm hơn đáng kể hơn gzip.
fgwaller

38

Nếu bạn thích chế độ đường ống, đây là giải pháp sạch nhất:

tar c some-dir | xz > some-dir.tar.xz

Không cần thiết phải đặt ftùy chọn để xử lý tệp và sau đó sử dụng -để chỉ định rằng tệp là đầu vào tiêu chuẩn. Cũng không cần thiết phải chỉ định -ztùy chọn cho xz, vì đó là mặc định.

Nó hoạt động với gzipbzip2quá:

tar c some-dir | gzip > some-dir.tar.gz

hoặc là

tar c some-dir | bzip2 > some-dir.tar.bz2

Việc giải nén cũng khá đơn giản:

xzcat tarball.tar.xz | tar x
bzcat tarball.tar.bz2 | tar x
zcat tarball.tar.gz | tar x

Nếu bạn chỉ có tarlưu trữ, bạn có thể sử dụng cat:

cat archive.tar | tar x

Nếu bạn chỉ cần liệt kê các tập tin, sử dụng tar t.


8

Sử dụng tùy chọn nén xz

Nếu bạn muốn sử dụng các tùy chọn nén cho xzhoặc nếu bạn đang sử dụng tartrên MacOS, có lẽ bạn muốn tránh tar -cJfcú pháp.

Theo man xz, cách để làm điều này là:

tar cf - baz | xz -4e > baz.tar.xz

Bởi vì tôi thích định dạng của Wojciech Adam Koszek , nhưng không phải thông tin:

  1. c tạo một kho lưu trữ mới cho các tập tin được chỉ định.
  2. fđọc từ một thư mục (tốt nhất để đặt thứ hai này vì -cf! = -fc)
  3. - đầu ra cho đầu ra tiêu chuẩn
  4. | đầu ra ống cho lệnh tiếp theo
  5. xz -4ecác cuộc gọi xzvới -4etùy chọn nén. (bằng -4 --extreme)
  6. > baz.tar.xz chỉ đạo tập tin tarred và nén đến baz.tar.xz

ở đâu -4e, sử dụng các tùy chọn nén của riêng bạn. Tôi thường sử dụng -kđể --keepfile gốc và -9cho nén thực sự nặng. -zđể đặt thủ công thành xzzip, mặc dù nó mặc định là nén nếu không được hướng dẫn khác.

Giải nén và cởi trói

Để lặp lại Rafael van Horn , giải nén & cởi trói (xem ghi chú bên dưới):

xz -dc baz.tar.xz | tar x

Lưu ý: không giống như câu trả lời của Rafael , hãy sử dụng xz -dcthay vì catxz. Các tài liệu khuyến nghị điều này trong trường hợp bạn đang sử dụng điều này cho kịch bản. Tốt nhất nên có thói quen sử dụng -dhoặc --decompressthay vì unxzlà tốt. Tuy nhiên, nếu bạn phải, sử dụng các lệnh từ dòng lệnh là tốt.


Bất kỳ lý do cụ thể cho việc không sử dụng tar -cJfcú pháp trên MacOS? Chỉ tò mò, bởi vì tôi vừa mới làm điều đó và nó dường như đang hoạt động.
Lo-Tan

2
@ Lo-Tan Nó hoạt động nếu bạn có tar. Khi tôi đang sử dụng, tôi không có phiên bản tar phù hợp nên nó không hoạt động với tôi. Tôi cũng muốn sử dụng các tùy chọn nén cho xz, điều mà bạn không thể làm nếu bạn sử dụng tar. Ngoài ra, cú pháp đường ống giúp tôi dễ nhớ hơn, vì vậy tôi có xu hướng sử dụng nó. Nhưng với mỗi người
Connor

4

Thử cái này: tar -cf file.tar file-to-compress ; xz -z file.tar

Ghi chú:

  1. tar.gz và tar.xz không giống nhau; xz cung cấp nén tốt hơn.
  2. Đừng sử dụng đường ống | vì điều này chạy các lệnh đồng thời. Sử dụng ;hoặc &thực thi các lệnh lần lượt.

+1 Trên RHEL 5.10, tôi không thấy Jtùy chọn nào, nhưng cách này hiệu quả. Tôi nghĩ rằng bạn cần RHEL6.
Brian

2
Tại sao không điều chỉnh các lệnh để dẫn đầu ra từ tar sang xz?
mwfearnley

@mwfearnley Tôi nghĩ rằng ghi chú chỉ đơn thuần là nhấn mạnh rằng các lệnh cần phải được thực hiện tuần tự. Vì tên tệp được sử dụng trong cả hai lệnh, chúng sẽ không ghi hoặc đọc dữ liệu từ đầu ra hoặc đầu vào tiêu chuẩn. Nếu sử dụng lệnh mà không chỉ định tên tệp, chúng có thể được nối lại, như thế nào tar -c file-to-compress | xz -z > file.tar.xz.
Jack Q

Sử dụng &sẽ không khởi chạy lệnh lần lượt. Thay vào đó, nó sẽ khởi chạy cái đầu tiên như một quá trình nền.
Luis Lavaire
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.