Tüm alt dizinlerdeki belirli dosya türleri nasıl taranır?


86

Bir dizindeki ve alt dizinlerindeki tüm .php ve .html dosyalarını tar ve tar yapmak istiyorum. Kullanırsam

tar -cf my_archive *

istemediğim tüm dosyaları tarar. Kullanırsam

tar -cf my_archive *.php *.html

alt dizinleri yok sayar. Bunu yinelemeli olarak nasıl katlayabilirim, ancak yalnızca iki tür dosya içerir?

Yanıtlar:


146

find ./someDir -name "*.php" -o -name "*.html" | tar -cf my_archive -T -


@DeeDee Dosya sayısı vb. Konusunda herhangi bir sınırlama var mı?
user1566515

1
@DeeDee - hayır, demek istediğim parenlere ihtiyacın olmamasıydı!
Mike Makuch

@ user1566515 tar dosyanıza bir üst sınır koyacak bazı dosya sistemi limiti veya genel alan limiti olabilir. Bu tamamen kendi sisteminize bağlı. Aksi takdirde, borulama esasen tar dosyasını anında oluşturacaktır, böylece dosya numarası veya boyutuyla kısıtlanmayacaksınız.
DeeDee

Teşekkürler! ... 2'den fazla koşul / dosya türü nasıl eklenir?
gluuke

5
-o -name [pattern]Her yeni koşul için @gluuke kullanımı
DeeDee

15

bash4.0> 4.0 sürümünü kullanıyorsanız , bunu shopt -s globstarkısa bir süre gerçekleştirmek için yararlanabilirsiniz :

shopt -s globstar; tar -czvf deploy.tar.gz **/Alice*.yml **/Bob*.json

bu, herhangi bir alt dizinden Alice ile başlayan tüm .yml dosyalarını ve herhangi bir alt dizinden Bob ile başlayan tüm .json dosyalarını ekleyecektir.


2
Sadece tar kullanan tek cevap, en iyi cevap IMO.
simon

2
Dizin için glob '**' izlenimine rağmen, bu komut özyinelemeli olarak çalıştırılmaz (herhangi bir alt-klasör)
Eddie

@Eddie ** çalışmalı. parametrelerinizde farklı bir şey olabilir. Ayrıca, komut satırında geçirdiğiniz klasör adında herhangi bir boşluk olup olmadığını kontrol edin. Değilse, gerçek komutunuzu yapıştırabilir misiniz?
Sairam Krish

'**' komuta ulaşmadan önce kabuk tarafından değerlendirilir ve sadece 0 veya karaktere çözümlenen 2 bağımsız * olarak görülür, dizinleri yaymak
Eddie

2
@eddie evet, kabuk tarafından değerlendirilir, ancak bash> 4.0'ın bir shopt -s globstarseçeneği vardır, bu yüzden cevap doğru ve aslında en iyisi
Roman Usherenko

13

Yöntemlerden biri:

tar -cf my_archive.tar $( find -name "*.php" -or -name "*.html" )

Ancak bu yöntemle ilgili bazı uyarılar vardır:

  1. İçlerinde boşluklar olan herhangi bir dosya veya dizin varsa başarısız olur ve
  2. maksimum komut satırı uzunluğunun dolu olduğu çok fazla dosya varsa başarısız olur.

Bunlara geçici bir çözüm, find komutunun içeriğini bir dosyaya çıkarmak ve daha sonra tar için "-T, --files-from FILE" seçeneğini kullanmak olabilir.


1) "Başarısız" derken, boşluklu dosyaların atlanacağını veya tar arşivinin oluşturulmayacağını mı kastediyorsunuz? 2) Yaklaşık 100 bin dosyam var. Bu maksimum komut satırı uzunluğunu aşıyor mu?
user1566515

1
1. Arşivi oluşturacak, ancak eksik dosyaları bildirecektir. 2. Bunun çok uzun olacağını tahmin ediyorum. Bunu göz önünde bulundurarak, @DeeDee'nin aşağıda önerdiği gibi bir yöntemi kullanmak en iyisidir, bu sorunların üstesinden oldukça hoş bir şekilde geçecektir.
Robin Sheat

4

Bu, boşluklu yolları ele alır:

find ./ -type f -name "*.php" -o -name "*.html" -exec tar uvf myarchives.tar {} +

0

Onları bir dosyaya koyun

find . \( -name "*.php" -o -name "*.html" \) -print > files.txt

Ardından dosyayı tar için girdi olarak kullanın, kullandığınız tar sürümüne bağlı olarak -I veya -T kullanın.

Sembolik bağlantıları kopyalamak için h kullanın

tar cfh my.tar -I files.txt 

0

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -I 'pigz -9' -cf target.tgz

çok çekirdekli veya sadece tek çekirdek için:

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -czf target.tgz


-2
tar -cf my_archive `find ./ | grep '.php\|.html'`

Tüm dizinde ve alt dizinlerinde .php ve .html dosyalarının tüm yollarını almak için "bul" ve "grep" kullanın. Ardından bu yol bilgilerini sıkıştırmak için katrana iletin.

Lütfen şu sembollere dikkat edin 've'. Ayrıca, diğer cevaplardan farklı olarak bunun, kabuğunuzun komut satırında kaç karaktere izin vereceği sınırına ulaşacağını unutmayın.

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.