Linux birden fazla alt dizini ayrı arşivlere dönüştürür mü?


16

Alt dizinleri ayrı arşivlere nasıl sıkıştırabilirim?

Misal:

directory
 subdir1
 subdir2

Altdir1 (.tar) .gz ve altdir2 (.tar) .gz oluşturmalı

Yanıtlar:


27

Bu küçük komut dosyası, gereksinimleriniz göz önüne alındığında en iyi seçeneğiniz gibi görünüyor:

cd directory
for dir in */
do
  base=$(basename "$dir")
  tar -czf "${base}.tar.gz" "$dir"
done

Adlarında boşluk bulunan dizinleri düzgün şekilde işler.


Bana şu hatayı veriyor: bash: -c: satır 1: sözdizimi hatası: beklenmeyen dosya sonu
EarthMind

@EarthMind: Burada iyi çalışıyor. Komut dosyasının doğru kopyalanıp kopyalanmadığını kontrol edin.
Juliano

@EarthMind: Orijinal soruyu iyi açıkladığınızdan emin değilim. Bunu tekrar çalıştırmak ve önceki .tar.gz dosyalarını yalnız bırakırken yeni .tar.gz dosyaları mı almak istiyorsunuz? "Tmstamp = $ (tarih '+% Y% m% d-% H% M')" eklemeyi deneyin ve $ {base} yerine $ {base} - $ {tmstamp} olarak değiştirin.
freiheit

2
@EarthMind: her şeyi tek bir satıra koyacaksanız, tar komutunun hemen önünde noktalı virgül (;) olduğundan emin olun. Aksi takdirde, baz, kabuk yardımcı değişkeni yerine katran'a ortam değişkeni olarak geçirilir.
Juliano

@mwojtera senin teşebbüs düzenlemek kendi cevap olmalı
civciv

10

Buna ne dersin: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;

Açıklama: Geçerli dizindeki tüm öğeler üzerinde bir buluntu çalıştırırsınız. Maxdepth 0, verilen argümanlardan daha düşük olmamasını sağlar. (Bu durumda * veya geçerli dizininizdeki tüm öğeler) "-type" için "d" bağımsız değişkeni yalnızca dizinlerle eşleşir. Daha sonra exec ne olursa olsun tar çalıştırır. ({}, eşleşen dosyayla değiştirildi)


1
Ama sonra yine de verilen yolun bir dosya değil, bir dizin olduğu hatasını alıyorum
EarthMind

3
gzip tek başına dizinleri arşivlemez
Juliano

Onları gzip edebilmek için önce dizinleri katranmanız gerekir.
inkaphink

1
Dizinler için düz gzip değil, z seçeneğiyle katran gerekir. Gerçi bulmak çok güzel kullanımı.
freiheit

3
Hata: "find: paths ifadeden önce gelmelidir:;" İlk bölüm çalışıyor, bu yüzden kullandım (sadece dizinler): for dir in `find * -maxdepth 0 -type d`; do tar -cvzf ${dir}.tar.gz ${dir}; done
JosephK

4

Bu, blah adlı bir dizindeki her dosya için blah.tar.gz adlı bir dosya oluşturur.

$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done

Eğer sadece dizindeki dizinlerden daha fazlasına sahipseniz (yani dosyalar da, ls dizindeki her şeyi döndürür), o zaman bunu kullanın:

$ cd directory
$ for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$" `; do tar -cvzf ${dir}.tar.gz ${dir}; done

Grep -v findkomutta varsayılan olarak görünecek geçerli dizini hariç tutar .


3
Hem ls hem de find bu şekilde kullanılmak üzere yapılmamıştır. Özellikle ls, 'için' argüman olarak dosya listeleri oluşturmak için değil, kullanıcı tarafından okunabilir bir listede dosyaları sunmak için tasarlanmıştır. Sadece kullanınfor dir in *
Juliano

1
İlk önerinizi denedim ama adında boşluklar içeren dizinlerle çalışmaz
EarthMind

Ayrıca, ilk komut dizindeki her dosya için bir tarball yapar.
inkaphink
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.