Bir dosya listesinden girdi alan tar arşivleme


166

Zift ile arşivlemek istediğim dosyaların listesini içeren bir dosyam var. Haydi diyelimmylist.txt

Bu içerir:

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

mylist.txtGiriş olarak TAR komutunu verebilmemin bir yolu var mı ? Gibi bir şey

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

Böylece bu komutu verir gibi benzer:

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

4
Katran sayfası bu seçenek için son derece yararsızdır (en azından RedHat 5.4 ile 6.3 arasında): "-T: Dosyadan ayıklanacak veya F dosyasından oluşturulacak adları al". "Ayıkla veya oluştur" sesleri, tar arşivinden dosyaları almak için geçerli, ancak bunları koymamak için geçerli. -XHariç tutma seçeneği eski Unix tar komutundan sağ kalıyor, ancak görünüşe göre -I (dahil) olmadı!
Ogre Psalm33

Standartman bir EXAMPLESbölüm olmasına rağmen, bölüm içeren birkaç sayfa vardır . Bkz. < Unix.stackexchange.com/questions/306189/… >.
sam boosalis

Yanıtlar:


262

Evet:

tar -cvf allfiles.tar -T mylist.txt

Keşke mylist.txt içinde yorum koymak olabilir .. mylist.txt içinde bazı katran seçeneğini kullanarak herhangi bir geçici çözüm var mı?
Stphane

7
@Stphane bu, --exclude bayrağını kullanarak bunu sağlar. Yorum satırlarınızın bir '#' ile başladığını varsayarsak, aşağıdakiler gibi bir komut, cmments içeren satırlarda denenen dosya işlemlerini yok sayar / hariç tutar; yani komutunuz şöyle görünebilir: tar -cvf allfiles.tar --exclude = '^ # '-T mylist.txt. Tar bir hata bildirir, ancak tar arşivinizi kontrol ettiğinizde hata yoktur ve listedeki tüm dosyalar arşivinizin içindedir.
Matt G

Bu komutun linux varyantı ve sunOS veya diğer varyantlar için olduğunu belirterek, aşağıdaki diğer cevaplara göz atın. Örneğin sunOS için test ettiğim iki alternatif: tar -cvf file.tar -I list.txt ve tar -cvf file.tar $ (cat list.txt)
Nasri Najib

-L mylist.txtAIX'te
Roland

82

GNU katranı varsayarsak (bu Linux olduğu için) -Tveya --files-fromseçeneği istediğiniz şeydir.


3
Bu seçenek FreeBSD 10. "bsdtar 3.1.2" var
drue

33

Yararlı olabilecek dosya adlarını da ekleyebilirsiniz:

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

2
.Txt dosya listesi gerçekten çok büyükse ne olur? Tar -c .. yerine tar -r .. ile xarg komutu kullanılmalı mı?
Stphane

1
@Stphane Hmm, listenin uzunluğunun bu yöntem için çok önemli olduğunu düşünmüyorum. Aslında, xargs veri eklemek için katranı tekrar tekrar çalışacağından, bu yöntemin xargs'den daha iyi olduğunu düşünürdüm, ancak yöntemleri gerçekten yan yana test etmedim.
woot

2
Burada olduğu gibi bir boru kullanıldığında, işletim sistemi borunun her iki tarafında akışlar oluşturur ve veri üretimini ve tüketimini senkronize eder. Dosyaların listesi sonsuz olabilir. Borunun ucunda yeterli depolama alanına sahip olmanız koşuluyla, tüm İnternet'i bir Raspberry Pi Zero kullanarak tar / gz yapabilirsiniz.
Richard Gomes

14

Bazı tar sürümleri, örneğin, HP-UX'teki varsayılan sürümler (11.11 ve 11.31'i test ettim), bir dosya listesi belirtmek için bir komut satırı seçeneği içermez, bu nedenle iyi bir çözüm budur:

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

4
UUoC (gereksiz kullanımı cat), basitçe $(<mylist.txt).
David C. Rankin

2
bu mylist.txtbüyükse komut satırının maksimum uzunluğunu aşabileceğini unutmayın
Andre Holzner

bu durumda tar -T <(<mylist.txt). bu cevap gibi gereksiz.
Mike D

7

Solaris'te, komut satırında normalde belirttiğiniz dosya adlarını bir dosyadan okumak için -I seçeneğini kullanabilirsiniz. Komut satırının aksine, bu, yüz binlerce dosyayla katran arşivleri oluşturabilir (bunu yaptı).

Yani örnek

tar -cvf allfiles.tar -I mylist.txt

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.