sadece tar dosyaları, dizin yok


16

Muhtemelen sadece dosyaları bulmak için bir kabuk komut dosyası yazabilir, sonra listeyi tar'a iletebilirim, ancak tar'da tek bir komut satırında sadece bunu yapmanıza izin veren yerleşik bir özellik olup olmadığını merak ediyorum?

Örneğin, --no-recursionanahtarı buldum , ama yaptığımda:

tar --no-recursion -cvf mydir.tar mydir

Yalnızca dizindeki girdilerin adlarını (alt dizinler dahil!) Arşivler, ancak herhangi bir dosyayı arşivlemez.

Ayrıca denedim:

 tar --no-recursion -cvf mydir.tar mydir/*

Ancak yalnızca dosyaları arşivlerken , alt dizinlerin adlarını da arşivler .

Sadece tar dosyalarını söylemenin bir yolu var mı, dizin yok mu?


5
Açıklığa kavuşturmak için: "düz" yapıya sahip bir arşiv (yani tüm dosyalar tek bir dizinde karıştırılmış) oluşturmak ister misiniz?
11:11, rozcietrzewiacz

1
Yeni bir dizin find mydir -type f |xargs cp -t tempdirve ardından tar tempdir oluşturabilirsiniz.
Kevin

@rozcietrzewiacz Evet, düz, ancak yalnızca bu dizinden, alt dizinlerden değil.
11:17

1
Tamam, sanırım ne yapmaya çalıştığını görüyorum. Peki yafind mydir -depth 1 -type f | xargs tar cf mydir.tar
Kevin

2
Ah, boşluklar. Kullanım bulmak yerine -exec var: find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +. +Xargs gibi aynı komut satırında tüm koyar dosyaları.
Kevin

Yanıtlar:


11

Camh'ın işaret ettiği gibi, önceki komutun çok fazla dosya adı verildiğinde küçük bir sorunu vardı, daha sonra çağrılar sessizce önceki çalıştırmaları silerek. Biz de sıkıştırmıyoruz, üzerine yazmak yerine ekleyebiliriz:

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar Avf mydir.tar
find mydir -maxdepth 1 -type f -exec tar Avf mydir.tar {} +

Iocnarz cevabı kullanmanın tar'ın --nullve -Tseçeneklerinin yanı çalışır. Eğer cpioyüklediyseniz, camh'ın bu yanıtı kullanması da iyidir. Ve zshbunu bir komut için kullanmanın sakıncası varsa ve sakıncası yoksa, Gilles'in bir zsh glob ( *(.)) kullanarak verdiği cevap en basit olanıdır.


Anahtar -maxdepthseçenek oldu. Son cevap, uygun alanlarla ilgili:

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar cvf mydir.tar

Bunun da çalışması gerekir:

find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +

4
Bunların her ikisi de birden fazla çağrılmasına neden olabilir tar. Hem xargsve findbirlikte +varyant katran geçirilen bir bağımsız değişken bir sayısını alır. Bu, ikinci katranın ilk çıktısının üzerine yazılmasıyla sonuçlanacaktır.
camh

2
Xargs sınırını genişleten xargs varsayılan olarak maksimum 128 KB komut satırına geçer. Dosya listesi daha büyükse, (tar) komutunun ikinci (veya daha fazla) çağrılmasını sağlayarak sessiz veri kaybına yol açar. -xXargs'ı veri kaybetmek yerine başarısız olmaya zorlamak için kullanabilirsiniz ve sessiz bir veri kaybı hatasından daha iyi olsa da, yine de ideal değildir. Bu sıralama hatası çok tehlikelidir çünkü her şey ilk başta iyi görünür, ancak dosya listesi zamanla büyüdükçe, tetiklemeye başlarsınız ve yedeklemenizi geri yüklemeye çalışana kadar fark etmeyebilirsiniz. Sonra çok geç.
camh

@camh Haklısın, işaret ettiğin için teşekkürler; Bunu yansıtacak şekilde güncelledim.
Kevin

1
"Son cevap" doğru değil, -T olmadan "tar c" kullanırsanız kısmi sonuçlar alabilirsiniz.
eckes

14

Kullanmak istediğinizde findile tar, en iyi yolu kullanmaktır cpioyerine tar. cpiokatran arşivleri yazabilir ve stdin'den arşivlenecek dosyaların listesini almak için tasarlanmıştır.

find mydir -maxdepth 1 -type f -print0 | cpio -o -H ustar -0 > mydir.tar

findVe cpiokomutunu kullanmak find, dosya seçimini sahip olduğu tüm güçle cpioyapmanıza ve arşivlemeyi yapmanıza izin vermeniz açısından daha unix-y bir yaklaşımdır . Bu basit kullanımını öğrenmeye değer cpio, çünkü denerken karşılaştığınız sorunları çözmeyi kolay bulursunuz tar.


Parlak! Uzak geçmişte cpio kullandım, ancak ustar seçeneğini hiç bilmiyordum.
Ian McGowan

2
Bu benim için kabul edilen cevaptan çok daha iyi çalıştı.
Dale Anderson

1
sadece bir nit. -maxdepth 1, -type f'den önce gelmelidir, yoksa bazı buluntulardan uyarı alırsınız
kdubs

Teşekkürler @kdubs. Ben koymak cevabını güncelledik -maxdepthönce -type.
camh

3

İhtiyaçlarınızı anladığımdan emin değilim. Normal dosyaları mydiralt dizinlerinde saklamak istiyorsanız, ancak en kolay yolu zsh kullanmaktır, burada normal dosyaları eşleştirmek . glob niteleyicisini kullanmanın basit meselesidir :

tar cf mydir.tar mydir/*(.)

3

Hatta kullanabilir find ... -print0ve tar ... --nulldoğrudan kullanmadan xargshiç.

find . -maxdepth 1 -type f -print0 | tar cvf mydir.tar --null -T -

Verilen örnekte, --no-recursionseçeneğine targerek yoktur çünkü yalnızca dosya yolları (dizinler değil) ' findden geçirilecektir tar.

Bununla birlikte, aşağıdaki örnekte --no-recursionseçeneğinin kullanılması, dizinlerin çift arşivlenmesini tarönler tar. findyerine dizin ağacı özyineleme yapacak tar.

# compare
find . -print0 | tar cf mydir.tar --null -T -
tar -tf mydir.tar | nl

find . -print0 | tar cf mydir.tar --null --no-recursion -T -
tar -tf mydir.tar | nl

2

Giriş paragrafının man tardediği gibi (son cümle),

Bir dizin adının kullanılması her zaman aşağıdaki alt dizinlerin arşive dahil edilmesi gerektiğini gösterir.

Hangi soruya "hayır" cevabı olarak anlıyorum.


Katran şimdi sayısız dışlama meachisms kapsaması haricinde İyi yakalamak, (örneğin --no-recursion, --exclude-tagvb.) --exclude-tagHangi umut verici görünüyor ama aradığımın tam tersi gibi görünüyor.
ateiob

Bunu denedim ve karakterlerin uzun yol adlarından kaldırıldığını gördüm. Katranı -T ve --null ile camh'ın önerdiği gibi kullanmak bu sorunu önledi.
Paul Brannan

1
star -c -C startdir -find . ! -type d > out.tar

Atla -C startdirve değiştirme .ile startdirbunun arşivde görünmesi gerekiyorsa.

Bu, libfind'in özelliklerine dayanan en verimli yöntemdir. Libfind ayrıca, -chown -chgrp -chmodyapı statüsünü yerinde değiştiren ve farklı meta verileri arşivlemeye izin veren primerler sunar . Bu aynı zamanda liste ve çıkarma modunda da çalışır ve birçok durumda tüm arşivi çıkarma ihtiyacını ortadan kaldırır.


Kullanmak Can -findiçinde -copymod. Man sayfası özeti yapabileceğinizi gösteriyor ancak çalışmasını sağlayamadım ( klasör yapısını korurken değiştirilen dosyalar nasıl kopyalanmaya çalışılırken ) (schily-2016-02-10 ile)
Stéphane Chazelas

Bunu daha uzun süre test etmedim. Şu anda bir hata olabilir. Man sayfası, son argümanın ayıklama dizini olacağını söylüyor, ancak bunu denediğimde şunu elde ediyorum: "Ayıklama modunda henüz desteklenmeyen yol bağımsız değişkenleri". Denediğinizde elde ettiğiniz bu mu?
schily

Evet. Man sayfası ayrıca -find'dan sonra yalnızca argümanlar bulabileceğinizi söylüyor, ancak hedef dizini -find'den önce koyarsam da bir hata alıyorum
Stéphane Chazelas

Ayıklama işleminde bulma kodunu kapatmak için bir kod vardır ve hata mesajı -c'yi bekleyen ancak -copy'ye izin vermesi gereken yanlış bir denetimden kaynaklanır. Kopyalama modunda, ayrıştırıcı son argümanı içermemelidir.
schily

1
Şimdi son bir çözüm sourceforge.net/projects/schilytools/files/schily-2016-03-11.tar.bz2 adresindeki şematik araçlarda yayınlandı ve bu da yıldızdaki eksik bir setlocale () 'den gelen bir sorunu çözüyor ve bu da - C için directrory star -find.
schily

0

Bir çözüm bulabilirdim.

find mydir -type f -printf '%P\0'|tar czvf mydir.tar.gz -C mydir --null -T -

Bu biraz maliyetli olabilir, ancak yine de işe yarayacaktır, çünkü bu xargs'a bağlı değildir.


-1

dir = your_dir; cd $ dir; tar -cvf file.tar `bulmak. -maxdepth 1-tipi f-baskı`

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.