Bir dizini tarlayın, ancak tam mutlak yolları arşivde saklamayın


277

Bir yedek kabuk komut dosyası bölümünde aşağıdaki komutu var:

tar -cjf site1.bz2 /var/www/site1/

Arşiv içeriğini listelediğimde:

tar -tf site1.bz2
var/www/site1/style.css
var/www/site1/index.html
var/www/site1/page2.html
var/www/site1/page3.html
var/www/site1/images/img1.png
var/www/site1/images/img2.png
var/www/site1/subdir/index.html

Ancak /var/www/site1çıkarma işlemini basitleştirmek ve gereksiz sabit dizin yapısından kaçınmak için parçayı arşiv içindeki dizin ve dosya adlarından kaldırmak istiyorum . Bilmiyorum, yedeklenmiş web sitelerini web verilerinin depolanmadığı bir yerde çıkarırsam /var/www.

Yukarıdaki örnek için, sahip olmak istiyorum:

tar -tf site1.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html

Böylece, ayıkladığımda, dosyalar geçerli dizinde ayıklanır ve ayıklanan dosyaları daha sonra taşımama gerek kalmaz ve böylece alt dizin yapıları korunur.

Zaten stackoverflowweb üzerinde ve diğer yerlerde katran ve yedekleme hakkında birçok soru var , ancak çoğu tüm alt dizin yapısını düşürmeyi (düzleştirme) ya da sadece adların başındaki / t Çıkarırken tam olarak neyin değiştiğini bilmiyorum), ama artık yok.

Burada ve orada bulunan çözümlerin bazılarını ve kılavuzu okuduktan sonra denedim:

tar -cjf site1.bz2 -C . /var/www/site1/
tar -cjf site1.bz2 -C / /var/www/site1/
tar -cjf site1.bz2 -C /var/www/site1/ /var/www/site1/
tar -cjf site1.bz2 --strip-components=3 /var/www/site1/

Ama hiçbiri istediğim gibi çalışmadı. Bazıları hiçbir şey yapmaz, bazıları ise artık alt dizinleri arşivlemez.

Bir Cron tarafından başlatılan bir yedek kabuk komut dosyası içinde, bu yüzden iyi bilmiyorum, hangi kullanıcı çalıştırır, yol ve geçerli dizin nedir, bu yüzden her zaman mutlak yol yazmak her şey için gereklidir ve geçerli dizini değiştirmemeyi tercih ederim komut dosyasında bir şeyleri kırmaktan kaçınmak için (çünkü sadece web sitelerini değil, aynı zamanda veritabanlarını da yedekler, sonra hepsini FTP'ye gönderir vb.

Bunu nasıl başarabilirim?

-C seçeneğinin nasıl çalıştığını yanlış anladım mı?



Eh, -Csadece "dizin değiştirme" anlamına gelirken, bir yol (veya önek) değiştirmek sadece tarafından yapılabilir --transform. rif. superuser.com/questions/595510/prepend-prefix-in-tar/595512 basitçe -C (dizini değiştir) ve --transform yapabilirsiniz: `` tar cjf site1.bz2 --transform "s / ^ \. \ // $ targetbase / "-C / var / www / site1. ``
Daniele Cruciani

Bu çok iyi bir soru ve ne yazık ki bu tarihe verilecek cevapların hiçbiri tatmin edici değil. Bilge bir kişiden, orijinal konuma veya dizin ağacına herhangi bir başvuru yapmadan sadece tek bir style.css dosyasını (yukarıdaki örnek) mevcut dizine nasıl ayıklayabileceğimizi henüz duymadık mı? Mevcut dizinimi istenmeyen yeni ağaç yapısıyla karıştırmak istemiyorum. Yıllardır görmezden gelinen ciddi bir tarball eksikliği gibi görünüyor.
elmclose

Yanıtlar:


383
tar -cjf site1.tar.bz2 -C /var/www/site1 .

Yukarıdaki örnekte, /var/www/site1seçenek -C /var/www/site1verildiği için tar işleminden önce dizine değişecektir .

Gönderen man tar:

OTHER OPTIONS

  -C, --directory DIR
       change to directory DIR

152
Sonunda noktayı kaçırmayın, bu önemli ;-)
Freedom_Ben

9
joker karaktere dayalı olarak yedeklenecek dosyaları da seçmek istiyor musunuz? -C / var / www / site1 * .dat çalışmıyor :(
Andy Lorenz

16
Nokta tar, geçerli dizindeki her şeyi arşivlemeyi söyler . Ve -Cgeçerli dizini ayarlar.
Lars Brinkhoff

21
Harika çalışıyor. Dizin adını korumak için yararlı buluyorum (sadece tam yol değil), bu yüzden aşağıdakileri yaptım: tar -czvf site1.tar.gz -C /var/www/ site1(Boşluğa, hala -C'yi kullanıyorum, üst direktöre cd için yerine nokta)
jorfus

9
Katran yolunda önde gelen bir nokta alıyorum, örneğin ./foldersbu nasıl kaldırılabilir?
Mika571

39

Seçenek -Cçalışıyor; sadece açıklama için 2 örnek göndereceğim:

  1. tam yol olmadan bir tarball oluşturulması: tam yol /home/testuser/workspace/project/application.warve istediğimiz şey sadece project/application.war:

    tar -cvf output_filename.tar  -C /home/testuser/workspace project

    Not: arasında bir boşluk vardır workspaceve project; tar tam yolu sadece ile değiştirecektir project.

  2. hedef yolunu değiştirerek tarball çıkarımı (varsayılan ., yani geçerli dizine)

    tar -xvf output_filename.tar -C /home/deploy/

    tarverilen yola göre ve yaratma yolunu koruyarak tarball çıkarır; örneğimizde dosyaya application.warçıkartılacaktır /home/deploy/project/application.war.

    /home/deploy: ekstrakt üzerine verilir
    project: tarball oluşturulması üzerine verilir

Not: oluşturulan tarball'ı hedef dizine yerleştirmek istiyorsanız, hedef yolu tarball adından önce eklemeniz yeterlidir. Örneğin:

tar -cvf /path/to/place/output_filename.tar  -C /home/testuser/workspace project

1
Son örnekte dosya seçimi için joker karakter nasıl eklenir?
Siva

Joker karakterlerle ilgili sorun, kabuğun onları eşleşen dosya adlarına genişletmesi ve katranın alıntı
yapıldıklarında

Ben Ubuntu 18.04 ve hiçbir şans denedim. Neyi özlediğimden emin değilim. Paketlendiğimde stdout'um doğru bir şekilde görüntüleniyor, ancak paketini kaldırdığımda hala tam yol var
sdc

14

-CTar v2.8.3'e kadar seçenek tüm platformlarda (OS'ler) tutarlı bir şekilde çalışmıyor gibi görünüyor . -Cseçeneğinin arşive dizin eklediği söylenir, ancak Mac ve Ubuntu'da oluşturulan tar.gz dosyasının içine mutlak yol öneki ekler.

tar target_path/file.tar.gz -C source_path/source_dir

Bu nedenle tutarlı ve sağlam bir çözüm cdkaynak_yoluna (kaynak_dizin üst dizini) girilmeli ve çalıştırılmalıdır.

tar target_path/file.tar.gz source_dir

veya

tar -cf target_path/file.tar.gz source_dir

betiğinizde. Bu, oluşturulan tar.gz dosyanızın dizin yapısındaki mutlak yol önekini kaldıracaktır.


1
-C seçeneğinin kullanılması DID , fedora 29'da oluşturulan tar.gz dosyasının içindeki mutlak yol öneklerini kaldırır. Cevabınız bazı sistemlere özgü mü?
EL_DON

@EL_DON: Fedora'da -C seçeneğini test etmedim, ancak katran uygulama yazılımı, tar uygulamasında bir hata olmadığı sürece her platformda tutarlı bir şekilde çalışmalıdır. -C seçeneği, Mac 10.8 ve Mac 10.13 ve Ubuntu üzerinde test ettim (sürüm hatırlayamıyorum). Ancak tar v2.8.3 itibariyle, komut tar -cf target_path / file.tar.gz source_dir olarak değiştirildi ve yine de -C seçeneği eklerseniz oluşturulan tar.gz dosyasının içindeki mutlak yol önekini kaldırmaz.
Chinthaka Senanayaka

Bir centOS sisteminde tekrar test ettim. Örnekteki tüm yolları oluşturduktan ve komutu -cvfekledikten sonra ( sonradan eklenmiş olarak tar), ortaya çıkan tar.gz dosyasının, içinde başka birkaç cevapla tutarlı olan mutlak yollar olmadığını görüyorum. Test için kullandığım her iki sistemde katranın bozuk veya eski olduğunu düşünüyorsanız, lütfen yanıtınızı destekleyecek bazı belgelere bağlantı verin. Bence -Cseçenek yürütmeden önce dizini değiştirir (diğer cevaplarda olduğu gibi). Onu atladığımda, tar ./başlangıçtan itibaren yollar da dahil olmak üzere önemsiz eklemeye çalışır ./.
EL_DON

Bu dokümanı kullandım: linux.die.net/man/1/tar Evet, doktor -C yol değişikliğini yapacağını söylüyor, ancak Mac 10.13'ümde çalışmıyor. Bu, tar uygulamasının tutarsız bir davranışı olabilir. Bu bir hata olduğu anlamına gelir. Tüm unix platformlarında çalıştırmak için bir kabuk komut dosyası yazıyorsanız, tüm işletim sistemlerinde çalışacak kod çalıştırma konusunda daha güvenli olun.
Chinthaka Senanayaka

Cevabınız bir hata olabileceğini ve platformlar arası uyumluluk için daha sağlam çözümün cdilk önce olduğunu söylemiyor . Cevabınız, aracın dokümanların nasıl çalıştığını ve sistemimde nasıl çalıştığını tam tersi şekilde çalıştığını söylüyor, bu yüzden yanlış bir cevap. Kolayca düzeltebilirsiniz.
EL_DON

7

Aşağıdaki komut bir "" kök dizini oluşturur. ve belirtilen dizindeki tüm dosyaları içine koyun.

tar -cjf site1.tar.bz2 -C /var/www/site1 .

Tüm dosyaları tar dosyasının köküne koymak istiyorsanız, @chinthaka haklıdır. Sadece dizine cd ve yapmak:

tar -cjf target_path/file.tar.gz *

Bu, cwd'deki tüm dosyaları tar dosyasına kök dosyalar olarak koyacaktır.


1
* Kullanıldığında "gizli" .files veya .folder kaydedilmez. (fyi, -C ile * kullanıldığında başarısız olur, kabuk -C
dizinini

1

"Nokta" kullanmak, "nokta" adlı bir klasörün oluşturulmasına yol açar (Ubuntu 16'da).

tar -tf site1.bz2 -C /var/www/site1/ .

Bu konuyu daha ayrıntılı ele aldım ve bir örnek hazırladım. Çok satırlı kayıt, ayrıca bir istisna.

tar -tf site1.bz2\
    -C /var/www/site1/ style.css\
    -C /var/www/site1/ index.html\
    -C /var/www/site1/ page2.html\
    -C /var/www/site1/ page3.html\
    --exclude=images/*.zip\
    -C /var/www/site1/ images/
    -C /var/www/site1/ subdir/
/

Neden ona "nokta" diyorsun? .Geçerli dizin olan sadece . tar.gzYapısı bağlamında , bu sadece temel / kök / üst düzey, değil mi?
EL_DON

Ayrıntılar için anlık görüntüye bakın . Benim yolum kullanmak daha doğru, Benim fikrim.
Sergey Asachev

0

Bir alt dizini arşivlemek ve alt dizin yolunu kırpmak istiyorsanız bu komut faydalı olacaktır:

tar -cjf site1.bz2 -C /var/www/ site1
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.