it-mot-dan-vi.com

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

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

Tôi là 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 for hoặc find hoặc những thứ tương tự để gọi tar một lần cho mỗi tệp lưu trữ 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 khiến tar của tôi trích xuất hai tệp .tar.gz cùng một lúc. (Và không, không có gì sai với for, tôi chỉ đơn thuần là hỏi liệu nó có thể làm mà không cần.)

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

  • có một ngã ba lạ của tar ở đâu đó hỗ trợ điều này
  • ai đó biết cách sử dụng -M tham số mà tar gợi ý cho tôi khi tôi thử tar -zxv -f a.tgz -f b.tgz
  • tất cả chúng ta đều 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 for hoặc find hoặc xargs hoặc giống.

Xin đừng trả lời với tar -zxvf *.tar.gz (vì điều đó không không hoạt động) và chỉ trả lời với những tác phẩm không có tác dụng nếu bạn hoàn toàn chắc chắn về điều đó (và có thể có một giải thích tốt tại sao, quá).

Chỉnh sửa: Tôi đã được chỉ vào một câu trả lời cho câu hỏi này trên Stack Overflow trong đó nói rất chi tiết rằng không thể thực hiện được nếu không phá vỡ cú pháp tar 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.tgz hoặc là tar -zxv --all-args-are-archives *.tar.gz sẽ phá vỡ không có cú pháp hiện có, imho.

39
scy

Đ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)
43
polynomial

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

Dành cho *. Tar.xz:

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

Bạn cần sử dụng một vòng lặp. Nó sẽ không phá vỡ cú pháp dòng lệnh tar để cho phép nhiều tùy chọn -f, 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 Edge (Điều gì xảy ra nếu một Lưu trữ ở giữa không đúng định dạng? Các tài liệu lưu trữ có thể sử dụng các cơ chế nén khác nhau không? Bạn có thể có nhiều tùy chọn -C (tùy chọn GNU tar để trích xuất vào một thư mục cụ thể) không? tại một tên thành viên nhất định)?.

Một khả năng tránh vòng lặp for là cài đặt và kích hoạt AVFS , a Fuse hệ thống tệp cung cấp quyền truy cập minh bạch vào tài liệu lưu trữ. Mỗi kho lưu trữ /path/to/archive Nhân đôi thành một thư mục ~/.avfs/path/to/archive#. Nếu bạn muốn khớ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 khi thêm # Vào một kết hợp 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

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

0
zjengjie