üst dizini içermeyen bir tar arşivi oluşturmak


62

Senaryom için grafiksel bir program oluşturmaya çalışıyorum.

Script içinde tar tar arşivi oluşturmak için tar kullanıyorum.

Grafik programdan bir tar arşiv oluşturmak istediğim dosyanın tam adını alıyorum.

tar -cvf temp.tar /home/username/dir1/dir2/selecteddir 

Tar arşivimde home, username, dir1, dir2 ve selecteddir komutları bulunurken, tar sadece seçilendir dahil olmak üzere arşiv oluşturmak istiyor.

Yanıtlar:


79

Bunu başarmak için -Cseçeneğini kullanabilirsiniz tar:

tar -C /home/username/dir1/dir2 -cvf temp.tar selecteddir

Man sayfasından tar:

-C directory
         In c and r mode, this changes the directory before adding the following files.  
         In x mode, change directories after opening the archive but before extracting 
         entries from the archive.

i / home / username / dir1 / dir2 kadar selecteddir ve yoluna $ yolunu bölünmüş nasıl anlarım yüzden can kullanıcı -C seçeneği
Sujit Maharjan

@SujitMaharjan dirname"selecteddir" 'e kadar olan her şeyi çıkarmak ve "selecteddir"' basenamei çıkarmak için kullanabilirsiniz. İki komutu $ path ile argüman olarak deneyin.
MKC

2
Bunun hem GNU hem de BSD Tar için geçerli olduğunu eklemeye değer.
Luke Exton,

5
-C seçeneğiyle globbing kullanamayacağınızı unutmayın. tar -C /home/username/dir1/dir2 -cvf temp.tar '*.csv'işe yaramayacak.
Christian Long,


11

Bu soruna yaklaşmak için kullanabileceğiniz iki yöntem vardır.

Birincisi, bence, daha kolay. Basitçe cd, sıkıştırmak istediğiniz dizinin hemen üstüne dizine girin. Bu durumda olur dir2.

$ cd /home/username/dir1/dir2/
$ tar -cvf temp.tar selecteddir

İkinci yol, --transformbir sedifade alan ve onu dosya adlarına karşı çalıştıran seçeneği kullanmaktır . Not: Eğer kaçmak zorunda kalacak /yer sedanlatım.

$ tar -cvf temp.tar /home/username/dir1/dir2/selecteddir --transform='s/\/home\/username\/dir1\/dir2\///g'

İlk yöntemin ucunda bir noktaya (.) İhtiyaç var mı? Ben olmadan denedim ve aldım: tar: Cowardly refusing to create an empty archive. Noktaya sahip olduğumda, sinir bozucu bir şekilde kök adlı bir dizin içeriyor .. Yani, yakın ama mükemmel değil.
JW01

1
Önceki yorumuma ek olarak. Sorunumu çözdüm. $ cd /home/username/dir1/dir2/ && tar -cvf temp.tar selecteddir *benim için çalıştı. Nokta yerine yıldız kullanarak .. Güncelleme: Woops - Gizli dosyaları kaybettim rağmen.
JW01

6

İlk önce çalışma dizinine gidin.

cd /your/working/directory/ 

O zaman sihir kullan *:-)

tar -cvf temp.tar *

Gizli dizinleri arşivlemeye çalışıyorum ve eğer onları doğrudan eklerseniz (Hayır *) işe yarar, ancak * kullanırken sadece arşivin adını arşive ekler ...
Ole

1

Aslında Ketan'ın cevabını kullanırken bir sorun buldum

tar -C / ana sayfa / kullanıcı adı / dir1 / dir2 -cvf temp.tar selecteddir

Sadece dir2'deki tüm dosyaları kopyalamak istediğinizde, sadece tüm dosyaları sonra ilk önce fikir çıkarım:

tar -C / ana sayfa / kullanıcı adı / dir1 / dir2 -cvf temp.tar *

Bununla birlikte, dir2 dizininde olmadığınız zaman, bu *, geçerli diectroyunuzda tar dosyalarını kullanacağından soruna yol açar. Ve aşağıdaki komutu kullanarak sorunu düzelttim:

 tar -C /home/username/dir1/dir2 -cvf temp.tar ./

6
Ancak temp.tar arşiviniz .bir kök klasör olarak içerir .
cgrim
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.