Lưu trữ Tar lấy đầu vào từ danh sách các tệp


166

Tôi có một tệp chứa danh sách các tệp tôi muốn lưu trữ bằng tar. Hãy gọi nó làmylist.txt

Nó chứa:

file1.txt
file2.txt
...
file10.txt

Có cách nào để tôi có thể phát lệnh TAR lấy mylist.txtđầu vào không? Cái gì đó như

tar -cvf allfiles.tar -[someoption?] mylist.txt

Vì vậy, nó tương tự như khi tôi ban hành lệnh này:

tar -cvf allfiles.tar file1.txt file2.txt file10.txt 

4
Trang tar man cực kỳ không hữu ích cho tùy chọn này (ít nhất là trên RedHat 5.4 đến 6.3): "-T: lấy tên để trích xuất hoặc tạo từ tệp F". "Trích xuất hoặc tạo" nghe có vẻ như áp dụng để lấy các tệp ra khỏi kho lưu trữ tar, nhưng không đưa chúng vào. -XTùy chọn loại trừ tồn tại từ lệnh tar tar Unix cũ, nhưng rõ ràng -I (bao gồm) thì không!
Ogre Psalm33

Có một vài mantrang với một EXAMPLESphần, mặc dù nó là một phần tiêu chuẩn . Xem < unix.stackexchange.com/questions/306189/ Khăn >.
sam boosalis

Câu trả lời:


262

Đúng:

tar -cvf allfiles.tar -T mylist.txt

Tôi ước tôi có thể đưa ý kiến ​​vào mylist.txt .. có cách giải quyết nào bằng cách sử dụng một số tùy chọn tar từ bên trong mylist.txt không?
Stphane

7
@Stphane đơn giản, sử dụng cờ --exclude cho phép điều này. Giả sử các dòng nhận xét của bạn bắt đầu bằng '#', một lệnh như sau sẽ bỏ qua / loại trừ mọi thao tác tệp đã thử trên các dòng chứa cmment, tức là lệnh của bạn có thể trông như thế này: tar -cvf allfiles.tar --exclude = '^ # '-T mylist.txt. Tar báo lỗi, nhưng khi bạn kiểm tra kho lưu trữ tar của mình, không có lỗi và tất cả các tệp trong danh sách đều nằm trong kho lưu trữ của bạn.
Matt G

Chỉ ra rằng lệnh này là dành cho biến thể linux và đối với những người dùng sunOS hoặc các biến thể khác, hãy kiểm tra các câu trả lời khác bên dưới. Ví dụ: đối với sunOS, hai lựa chọn thay thế mà tôi đã thử nghiệm: tar -cvf file.tar -I list.txt và tar -cvf file.tar $ (cat list.txt)
Nasri Najib

-L mylist.txttrên AIX
Roland

82

Giả sử GNU tar (vì đây là Linux), tùy chọn -Thoặc --files-fromlà những gì bạn muốn.


3
Tùy chọn này cũng tồn tại trong "bsdtar 3.1.2" trên FreeBSD 10.
drue

33

Bạn cũng có thể đặt tên tệp có thể hữu ích:

find /path/to/files -name \*.txt | tar -cvf allfiles.tar -T -

2
Điều gì nếu danh sách các tập tin .txt thực sự rất lớn? Có nên sử dụng lệnh xarg với tar -r .. thay vì tar -c ..?
Stphane

1
@Stphane Hmm, tôi không nghĩ độ dài của danh sách quan trọng lắm đối với phương pháp này. Trên thực tế, tôi sẽ tưởng tượng phương pháp này tốt hơn xargs vì xargs sẽ chạy lại nhiều lần để nối thêm dữ liệu, nhưng tôi chưa thực sự thử nghiệm các phương thức cạnh nhau.
woot

2
Khi một đường ống được sử dụng, đó là trường hợp ở đây, hệ điều hành tạo ra các luồng ở cả hai phía của đường ống và đồng bộ hóa việc sản xuất và tiêu thụ dữ liệu. Danh sách các tập tin có thể là vô hạn. Bạn có thể tar / gz toàn bộ internet bằng Raspberry Pi Zero, với điều kiện bạn có đủ dung lượng lưu trữ ở cuối đường ống.
Richard Gomes

14

Một số phiên bản tar, ví dụ, các phiên bản mặc định trên HP-UX (tôi đã thử nghiệm 11.11 và 11.31), không bao gồm tùy chọn dòng lệnh để chỉ định danh sách tệp, do đó, một cách giải quyết hợp lý là thực hiện việc này:

tar cvf allfiles.tar $(cat mylist.txt)

4
UUoC (sử dụng không cần thiết cat), đơn giản $(<mylist.txt).
David C. Rankin

2
lưu ý rằng điều này có thể vượt quá độ dài tối đa của dòng lệnh nếu mylist.txtlớn
Andre Holzner

trong trường hợp đó tar -T <(<mylist.txt). dư thừa như câu trả lời này.
Mike D

7

Trên Solaris, bạn có thể sử dụng tùy chọn -Tôi để đọc tên tệp mà bạn thường nêu trên dòng lệnh từ một tệp. Trái ngược với dòng lệnh, điều này có thể tạo ra kho lưu trữ tar với hàng trăm ngàn tệp (chỉ cần làm điều đó).

Vì vậy, ví dụ sẽ đọc

tar -cvf allfiles.tar -I mylist.txt

3

Đối với tôi trên AIX, nó hoạt động như sau:

tar -L List.txt -cvf BKP.tar
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.