Tar dosyasını alfabetik sırayla nasıl oluştururum?


22

Tüm dizinlerin ve dosyaların alfabetik sırada işlendiği bir tar dosyası oluşturmak istiyorum. Bu, katlanılan tüm dizin hiyerarşisi içindir, bu yüzden ilk dizini alfabetik olarak ve ardından alt dizinleri alfabetik olarak işleyerek başlayacaktır. Man sayfasına baktım ve bunun için bir anahtar bulamıyorum.

İtiraf edeceğim, bu yarı yenilik, yarı hafif optimizasyon. Bunu yapmanın kolay bir yolu olmadığına inanamıyorum. Bir şey eksik olmalıyım.


2
Bunu neden yapmak istiyorsun?
matthias krull

Çoğunlukla, katran işleminin tamamlanmaya ne kadar yakın olduğunu bilmek istiyorum. Dosyalar rasgele sırada yüklenirken, -v bayrağını söylemenin bir yolu yoktur.
Erick Robertson

2
Bu tamamen doğru değil; Çıktıyı bir dosyaya bağlarsanız ve dosya sayısını biliyorsanız (hızlı bul komutu söyleyin), ilerleme durumu elde etmek için -v çıktısını (wc -l) bulmaktan dosya sayısı ile karşılaştırabilirsiniz ...
Slartibartfast

2
@matthiaskrull Bunun ilgisiz bir nedeni var , VMWare ESX Server üzerinde VM'leri dağıtmak için bir OVA dosyası (bu bir tar dosyası) oluşturuyorum. OVA'nın içindeki belirli bir sırada dosyalara ihtiyacı vardır (İlk dosya bir OVF vb. Olmalıdır).
xask

1
Bunun çok iyi bir nedeni de var: sadece bir kısmını çıkarmak istediğinizde çok büyük bir dosyada performans. Sırası varsayılan olarak rastgele olduğundan ve bir dosyayı / dizini ayıklamak istediğiniz için, sipariş edilirse daha hızlı olacaktır, eğer değilse, tamamlanmadan önce tüm arşivi taraması gerekir.
StormByte

Yanıtlar:


12

Slartibartfast doğru yoldadır, ancak tar'ın varsayılan davranışı dizinlere inmektir, bu nedenle oluşturulan tar dosyasına dahil edilen aynı dosyanın birden fazla kopyasını alabilirsiniz. Bunu yaparak kontrol edebilirsiniz tar tf file.tar | sort Geçici çözüm, tar için --no-özyineleme seçeneğini eklemektir. Ayrıca, -print0 bulma seçeneğini ve ardından --nullkatran seçeneğini kullanarak garip dosya adları gönderebilmeniz gerekir . Sonuç şöyle görünür:

find paths -print0 | sort -z | tar cf tarfile.tar --no-recursion --null -T -

Kullanarak tar dosyasındaki siparişi kontrol edebilirsiniz tar tsf tarfile.tar. -Print0, -z ve --null seçeneklerine asla ihtiyacınız olmayacak olsa da, içine gömülü yeni satır içeren bir dosya adı ile karşılaşacağınızı bilmiyorsanız, bunu hiç denemedim.


--No-özyineleme seçeneğini kullanmak için mükemmel öneri, teşekkürler.
Erik

Benim için işe yarayan çözüm bu. Erick ve Google'ın beni buraya getirdiğinden farklı bir kullanım durumum var. Uzak bir sistemin tam durumu zaman içinde anlık görüntüler topluyorum. Veriler fazla yedeklidir. Katran girişini zamana göre sıralamak (dosya adlarında zaman damgası vardır) kompresörün performansını artırır. Hızlı bir test, faktör 2'ye (lzma2) göre bir iyileşme gösterir. Ayrıca, bir dosya sistemine arşiv açmak değil, katran girişleri üzerinde bir akış işleme yapmak. Sıralı akış çok daha güzel bir hata ayıklama çıktısı yapar ve işlem zincirinde başka faydaları vardır. +1
Johannes

5

Tar dosyasındaki dosyaların sırası gerçekten önemli değildir, çünkü dosyalar çıkarıldığında dosya sistemi siparişi yine de korumaz.

Bunun için bir anahtar yoktur, ancak gerçekten istediyseniz, tar'a sıralanmış bir sırayla dosya adları listesi sağlayabilir ve tar dosyasını verdiğiniz sırayla yaratabilirsiniz.

% tar cf tarfile tmp/diff.txt src/hellow.c junkimage.IMG barry/thegroup
% tar tf tarfile
tmp/diff.txt
src/hellow.c
junkimage.IMG
barry/thegroup

2
ya da çıktıyı sıralayın:tar tf tarfile | sort
Doug Harris

Hepsini komut satırında belirtmek için çok fazla dosya (20.000+) var.
Erick Robertson

4
İndirme işlemi sırasında sıkıştırılmış dosyayı açmanız ve görüntülemeniz gerekiyorsa, tar dosyası içindeki dosyaların sırası önemlidir.
Erik

Dosya sistemine bağlıdır.
Thorbjørn Ravn Andersen

4

Adlarında yeni satır içeren herhangi bir dosyanız olmadığını varsayarsak:

find /source_directory -print | sort | tar -czf target.tgz -T -

Bu işe yaramazsa (asla denemedim, bu yüzden bilmiyorum - -T argümanı için stdin anlamına gelir):

find /source_directory -print | sort > /tmp/temporary_file_list
tar -czf target.tgz -T /tmp/temporary_file_list

Sonra neden sorulur. Ancak bazen sormamak daha kolaydır.


2
find . -depth -print0 | sort -z | pax -wvd0 > file.tar

Pax, cpio ve katran ve bir çeşit sigortaların POSIX halefidir. Varsayılan olarak katran arşivlerini (ustar) yazar. Ayrıca, otomatik yayma ve ortam isteme yapar ve bittiğinde bir özet yazdırır.


0

@ CharlieHerron'un cevabına alternatif olarak, yalnızca içeriği (dosyalar, sembolik bağlantı) ve klasör meta verilerini (örn. Klasör izni, mtime vb.) Korumakla ilgileniyorsanız, klasörleri çıktılarından filtrelemek isteyebilirsiniz find.

find paths -not -type d -print 0 | sort -z | tar cf tarfile.tar --null -T -
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.