2014-11-24 35 views
5

İlk önce disk üzerinde oluşturmadan bir program çıktısından bir tar arşivine dosya eklemeye çalışıyorum. Oluşturma komut dosyası çalıştırıldığında, otomatik olarak oluşturulan bir dosya VERSION düşünün. Bu çalıştı ama dereferenced sembolik bağı normal bir dosya sadece bir adlandırılmış kanal, değil: Sonuç tar arşiv içinde bir zaman damgası içeren bir dosyayı VERSION olmalıdırTarla arşivine başka bir dosya olarak stdin'i ekleyin

$ date +%s | \ 
    tar cf test.tar \ 
    --dereference \ 
    --transform="s#/proc/self/fd/0#VERSION#" \ 
    /proc/self/fd/0 \ 
    other_files \ 
    and_folders/ 

w/yerel bir dosya oluşturulurken o:

$ tar tf test.tar 
VERSION 
other_files 
and_folders 

cevap

1

JAR arşivinde "sahte" dosya girişi oluşturmanın bir yolunu bilmiyorum. Normal bir dosya oluşturup arşive ekledim ve daha sonra siliyorum.

Ancak, -A (veya --concatenate) seçeneğini denemek isteyebilirsiniz. Bu, dosyayı /tmp'da oluşturmanıza, TAR arşivine eklemenize ve ardından dosyaların geri kalanını ikinci bir adımda eklemenize olanak tanır. Bu şekilde, VERSION dosyası için rasgele yollar oluşturabilirsiniz.

+0

Teşekkürler! Temelde şu an bunu yapıyorum. 'Mktemp' yapmak, '--transform = s/tempfile/VERSION/'ile arşive ekleyerek ve sonra da silerek. Bu adımı, bir çeşit boru büyüsü ile biraz daha özlü hale getirmeyi umuyordum. – Boldewyn

+0

Bunu yapmanın tek yolu budur; çünkü TAR'e dosya adı ve içeriği boru yoluyla veremezsiniz. '/ proc/self/fd/0',' tar' arşivlerini içeriklerini genişletmek yerine özel dosyalar olarak arşivlediğinden çalışmaz. Ben de bu durumda ''dereference''ın bunu değiştirmemesine şaşıyorum. –

+1

Eh, '--dereference' bir etkiye sahip: Yok, paketlenmiş'/proc/self/fd/0' bir sembolik bağlantı olarak kalıyor, yani adlandırılmış bir boru ('ls -F' türü bir' | 'to). Ancak paketlenmiş bir borunun kullanımı sınırlı ... – Boldewyn

1

tar dosyalarda çalıştığı doğru olsa da, bu, geçici dosyaları kendiniz oluşturmanız gerektiği anlamına gelmez ve buna karşı öneride bulunurdum.

Bunun için işlem değiştirmeyi kullanabilirsiniz (Bash bunu destekler, Balık slightly different syntax'da da çalışır).

tar cvaf a.tgz <(echo 1.0.0) file1 file2 -P --transform 's:^/.*:VERSION:' 

-P (--absolute-names) yeniden adlandırmak için adı dönüşümü için geçici dosyayı tanımlamak için burada. Umarım diğer dosyalar yereldir.

Bu durum söz konusu değilse ve bazı başka dosyalar mutlak yollar tarafından ekleniyorsa (ki bu büyük olasılıkla ortak durum değildir), daha sonra dönüştürme regexp'ini açıklığa kavuşturabilir veya önce arşivi oluşturarak iki adımlı çözümü kullanabilirsiniz. güncelleme (Aaron'ın işaret ettiği gibi).

+0

Bu, '/ proc' çözümümdeki aynı sorundan muzdarip: 'katran', normal bir dosya değil, bir boru paketler. Paketin açılmasında şunu söylüyor: '' $ cat VERSION \ ncat: VERSION: Dosya veya klasör bulunamadı '. – Boldewyn

+1

@Boldewyn Bu, kabuklar arasında farklı olma eğilimindedir. Balık gerçek adı verilen boruları 'mkfifo' ile (ör.'/Tmp/.psub.O02RnmHZ5g') oluşturur ve önerilen yöntem mükemmel çalışır. Bash, '/ dev/fd/63' gibi bazı sihirli dosyaları kullanır. Ne yazık ki, Bash'de proses ikamesi için 'mkfifo'ya geçmek için yerleşik bir yol yok gibi görünüyor. – eush77

+0

İlginç! Tamam, gerçekten işe yarayacak, ama burada Bash'e bağlıyım. – Boldewyn