Pengarsipan tar yang mengambil input dari daftar file


166

Saya memiliki file yang berisi daftar file yang ingin saya arsipkan dengan tar. Sebut sajamylist.txt

Itu mengandung:

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

Apakah ada cara saya bisa mengeluarkan perintah TAR yang diambil mylist.txtsebagai input? Sesuatu seperti

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

Sehingga mirip seperti jika saya mengeluarkan perintah ini:

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

4
Halaman manual tar sangat tidak membantu untuk opsi ini (setidaknya pada RedHat 5.4 hingga 6.3): "-T: dapatkan nama untuk diekstraksi atau buat dari file F". "Ekstrak atau buat" terdengar seperti itu berlaku untuk mengambil file dari arsip tar, tetapi tidak memasukkannya. -XOpsi mengecualikan bertahan dari perintah tar Unix lama, tetapi tampaknya -I (termasuk) tidak!
Ogre Psalm33

Ada beberapa manhalaman dengan EXAMPLESbagian, meskipun itu bagian standar . Lihat < unix.stackexchange.com/questions/306189/… >.
sam boosalis

Jawaban:


262

Iya:

tar -cvf allfiles.tar -T mylist.txt

Saya berharap saya bisa memberikan komentar di mylist.txt .. apakah ada solusi menggunakan beberapa opsi tar dari dalam mylist.txt?
Stphane

7
@Stphane itu sederhana, menggunakan flag --exclude memungkinkan ini. Dengan asumsi baris komentar Anda mulai dengan '#', perintah seperti berikut ini akan mengabaikan / mengecualikan operasi file yang dicoba pada baris yang mengandung cmments, yaitu perintah Anda dapat terlihat seperti ini: tar -cvf allfiles.tar --exclude = '^ # '-T mylist.txt. Tar melaporkan kesalahan, tetapi ketika Anda memeriksa arsip tar Anda, tidak ada kesalahan, dan semua file dari daftar ada di dalam arsip Anda.
Matt G

Mengatakan bahwa perintah ini adalah untuk varian linux dan untuk mereka yang menggunakan sunOS atau varian lain, periksa jawaban lain di bawah ini. Misalnya Untuk sunOS, dua alternatif yang telah saya uji: tar -cvf file.tar -I list.txt dan tar -cvf file.tar $ (cat list.txt)
Nasri Najib

-L mylist.txtpada AIX
Roland

82

Dengan asumsi tar GNU (karena ini Linux), opsi -Tatau --files-fromadalah yang Anda inginkan.


3
Opsi ini juga ada di "bsdtar 3.1.2" di FreeBSD 10.
drue

33

Anda juga dapat mem-pipe nama file yang mungkin berguna:

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

2
Bagaimana jika daftar file .txt benar-benar besar? Haruskah seseorang menggunakan perintah xarg dengan tar -r .. bukan tar -c ..?
Stphane

1
@Stphane Hmm, saya rasa panjang daftar tidak terlalu penting untuk metode ini. Bahkan, saya akan membayangkan metode ini lebih baik daripada xargs karena xargs akan menjalankan kembali tar berulang-ulang untuk menambahkan data, tetapi saya belum benar-benar menguji metode ini secara berdampingan.
woot

2
Ketika pipa digunakan, yang merupakan kasus di sini, sistem operasi menciptakan aliran di kedua sisi pipa dan menyinkronkan produksi dan konsumsi data. Daftar file bisa tak terbatas. Anda dapat menghitung seluruh internet menggunakan Raspberry Pi Zero, mengingat Anda memiliki cukup penyimpanan di ujung pipa.
Richard Gomes

14

Beberapa versi tar, misalnya, versi default pada HP-UX (saya menguji 11.11 dan 11.31), tidak menyertakan opsi baris perintah untuk menentukan daftar file, jadi penyelesaian yang layak adalah dengan melakukan ini:

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

4
UUoC (penggunaan yang tidak perlu cat), sederhananya $(<mylist.txt).
David C. Rankin

2
perhatikan bahwa ini mungkin melebihi panjang maksimum dari baris perintah jika mylist.txtbesar
Andre Holzner

dalam hal itu tar -T <(<mylist.txt). redundan seperti jawaban ini.
Mike D

7

Pada Solaris, Anda dapat menggunakan opsi -I untuk membaca nama file yang biasanya Anda nyatakan pada baris perintah dari file. Berbeda dengan baris perintah, ini dapat membuat arsip tar dengan ratusan ribu file (baru saja melakukannya).

Jadi contohnya akan dibaca

tar -cvf allfiles.tar -I mylist.txt

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.