Trích xuất nhiều tệp .tar.gz với một lệnh gọi tar


35

Tôi đã tự hỏi liệu (và, tất nhiên, làm thế nào) có thể nói tarđể trích xuất nhiều tệp trong một lần chạy.

Tôi là một người dùng Unix có kinh nghiệm trong vài năm và tất nhiên tôi biết rằng bạn có thể sử dụng forhoặc findnhững thứ tương tự để gọi tarmột lần cho mỗi kho lưu trữ mà bạn muốn giải nén, nhưng tôi không thể đưa ra một dòng lệnh làm việc gây ra tarđể trích xuất hai tệp .tar.gz cùng một lúc. (Và không, không có gì sai cả for, tôi chỉ đang hỏi liệu có thể làm mà không có.)

Tôi đang hỏi câu hỏi này vì tò mò, có lẽ

  • có một ngã ba kỳ lạ tarở đâu đó hỗ trợ điều này
  • ai đó biết cách sử dụng -Mtham số targợi ý cho tôi khi tôi thửtar -zxv -f a.tgz -f b.tgz
  • tất cả chúng ta đều bị mù và hoàn toàn dễ làm - nhưng tôi không thể tìm thấy bất kỳ gợi ý nào trên web không sử dụng forhoặc findhoặc xargstương tự.

Vui lòng không trả lời tar -zxvf *.tar.gz(vì điều đó không hiệu quả) và chỉ trả lời với không làm việc của nếu bạn hoàn toàn chắc chắn về điều đó (và có thể có một lời giải thích tốt tại sao ).

Chỉnh sửa: Tôi đã được chỉ ra một câu trả lời cho câu hỏi này trên Stack Overflow nói rất chi tiết rằng không thể thực hiện được nếu không phá vỡ tarcú pháp hiện tại , nhưng tôi không nghĩ đó là sự thật. Sử dụng tar -zxv -f a.tgz -f b.tgzhoặc tar -zxv --all-args-are-archives *.tar.gzsẽ phá vỡ không có cú pháp hiện có, imho.


Vì tò mò, tình huống nào khiến bạn bắt đầu suy nghĩ về cách tránh cấu trúc vòng lặp?
chúlejamil

1
FYI: GNU tar hỗ trợ lưu trữ tar nhiều khối với -Mtham số.
Steve-o

1
chúle: Tôi đang viết một HowTo và một trong các bước trong đó liên quan đến việc giải nén một số tệp nén (.tar.bz2, .tar.gz, .zip). Và vì đó là một HowTo, tôi đã tự hỏi dòng lệnh thanh lịch nhất để làm điều đó sẽ là gì. :)
scy

Câu trả lời:


39

Điều này là có thể, cú pháp khá dễ dàng:

$ cat *.tar | tar -xvf - -i

Tùy chọn -i bỏ qua EOF ở cuối kho lưu trữ tar, từ trang man:

-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)

1
Điều này dường như làm việc cho tôi. Lệnh chính xác tôi đã sử dụng là : cat *.tar.bz2 | tar -ixjv. Cảm ơn!
Scy

1
<Dành cho tgz> mèo * .tgz | tar -xzvf - -i -C / Destination / <hoặc> cho tệp trong * .tgz; làm tar -xzvf $ file -C / đích /; xong
Ferroao

27

cho * .tar.gz

for file in *.tar.gz; do tar -zxf "$file"; done

cho * .tar.bz2

for file in *.tar.bz2; do tar -jxf "$file"; done

cho * .tar.xz

for file in *.tar.xz; do tar -Jxf "$file"; done

1
Sửa định dạng ở đây, và điều này sẽ dễ đọc hơn.
Eyoung100

điều đó thật tuyệt. định dạng cũng tuyệt vời bởi vì nó trông như thế nào trong thiết bị đầu cuối
smatthewenglish

1
Đừng quên đặt dấu ngoặc kép $filenếu tệp của bạn có tên có dấu cách.
Alexander Revo

Điều này không thực sự trả lời cho câu hỏi liệu có thể trích xuất nhiều tài liệu lưu trữ bằng cách sử dụng một lệnh tar duy nhất không. Hơn nữa, người dùng nói rằng họ đã quen thuộc với cách sử dụng các vòng lặp for để lặp qua một tập hợp các tệp.
Kusalananda

2

Bạn cần sử dụng một vòng lặp. Nó sẽ không phá vỡ tarcú pháp dòng lệnh để cho phép nhiều -ftùy chọn, nhưng nó sẽ yêu cầu thêm mã để xử lý một số lưu trữ theo trình tự, với tất cả các loại điều kiện cạnh (Điều gì xảy ra nếu một kho lưu trữ ở giữa không đúng định dạng? Bạn cũng có thể có nhiều -Ctùy chọn (tùy chọn GNU tar để trích xuất vào một thư mục cụ thể) chứ? Còn về -K (tùy chọn GNU tar để bắt đầu ở một tên thành viên nhất định)?

Một khả năng tránh forvòng lặp là cài đặt và kích hoạt AVFS , một hệ thống tệp FUSE cung cấp quyền truy cập minh bạch vào kho lưu trữ. Mỗi kho lưu trữ /path/to/archivetăng gấp đôi như một thư mục ~/.avfs/path/to/archive#. Nếu bạn muốn kết hợp các tài liệu lưu trữ với các ký tự đại diện, sẽ có một trở ngại trong việc thêm nó #vào một trận đấu ký tự đại diện; nó có thể được thực hiện trong zsh.

mountavfs
cp -p ~/.avfs$PWD/{a,b}.tgz\#/* /destination
cp -p ~/.avfs/path/to/source/*.tgz(e\''REPLY=$REPLY\#'\')/* /destination

-1

find . -name "*.tar.gz" -exec tar xzf {} \;


cái này làm gì
Pierre.Vriens

1
Điều này giới thiệu một vòng lặp ngầm gọi tar một lần cho mỗi tệp được tìm thấy và người dùng nói rằng họ đã biết cách thực hiện việc này.
Kusalananda

Xin lỗi đã không đọc kỹ câu hỏi, tôi chỉ tìm cách trích xuất nhiều gói tar, đọc câu trả lời ở trên và nghĩ rằng việc tìm kiếm sẽ dễ dàng hơn.
zjengjie
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.