Dizin yapısı olmadan .tar dosyaları


32

Ben ediyorum .taryolu ile bazı dosyaları ing example/super_user/Output.*.

Sonuç .tarşöyle görünür:

+ example
    + super_user
          - Output.zip
          - Output.xml
          - Output.txt

Ancak dosyanın aşağıdaki gibi olmasını istiyorum:

- Output.zip
- Output.xml
- Output.txt

Hala başka bir dizinde iken bunu nasıl başarabilirim biliyor musun?


Bu tür arşivlere sahip tarbomblardan kaçındığınızdan emin olun .
yerçekimi

tar - strip bileşenleri = 1000?
Zaar Hai

Yanıtlar:


11

tar dosya ve klasör yapısını koruyacak, bu yüzden tar'a hiyerarşiyi düzene koyma talimatını vermenin hiçbir yolu olduğunu sanmıyorum.

Geçici bir çözüm, dizini geçici olarak değiştirmek, katranı oluşturmak, sonra geri dönmek - aşağıda hızlı bir örnek:

cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..

27

'Example' dizini dosya sisteminin kökündeyse, işte başka bir yol:

tar -C /example/super_user -cvf result.tar .

bu, dizini tar yapmak istediğiniz noktaya değiştirecektir. Buradaki uyarı, / example / super_user altında herhangi bir alt dizin varsa, dizin yapısının bu alt dizinler için korunacağı yönündedir.


1
Eldeki problemin cevabı budur. Bahsedilen uyarı, bu durumda bir sorun değildir. Diğer tüm cevaplar, sorunun çeşitliliğini açıklamak için geçici çözümlerdir.
joki

Bu gerçekten bu sorunun çözümü. Dizin kök olmak zorunda değildir, dizin yapısını varsayalım /home/u/foo/bar, çalışma dir /home/b, sonra tar -C foo/bar -cvf qiz.tar .iyi çalışır. Bir uyarı olsa, sen yani joker kullanamazsınız olmasıdır tar -C foo/bar -cvf qiz.tar *.log, tar -C foo/bar -cvf qiz.tar "*.log"ya tar -C foo/bar -cvf qiz.tar "foo/bar/*.log"çalışma olmaz.
Brice

1
Birden fazla dizine yayılmış birden fazla dosya eklemeniz gerekirse, ancak yine de tar dosyasının düz olmasını istiyorsanız, -Ctek bir tarkomutta birden çok kez kullanabileceğiniz belirtilmelidir .
sıfır298

10

Cevabımı buraya gönderdim:

https://stackoverflow.com/questions/13924856/unix-tar-do-not-preserve-directory-structure

repost (tembel ppl için)


Bu çirkin ... ama işe yarıyor ...

Aynı sorunu yaşadım ama birden fazla klasörle, her dosyayı düzleştirmek istedim. Sed bir ifade iletmek için "dönüştürme" seçeneğini kullanabilirsiniz ve ... beklendiği gibi çalışır.

bu ifade:

's/.*\///g' ('/' den önceki her şeyi sil)

Bu son emirdir:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info


7

Bir dizindeki (DIR) tüm dosyalarda, hiçbir üst dizin bilgisi olmadan (hatta ./ değil) bir katran (ARCHIVE.tar) oluşturmak için, aşağıdaki gibi bir şey kullanabilirsiniz:

find "DIR" -type f -printf "%f\n" | xargs tar cf ARCHIVE.tar -C "DIR"

Derinliği sınırlamak, belirli dosyaları seçmek ve diğer pek çok şeyi bulmak için bul ile oynayabilirsiniz.

İyi şanslar!


OSX find komutunda "find: -printf: unknown first veya operator" alıyorum. Herhangi bir ipucu?
TCB13

-printfstandart olmayan bir komuttur. Bunların çoğu sadece belirli sürümleriyle çalışır. Genellikle Süper Kullanıcı hakkındaki bir soruya cevap verirken bunları işaretleriz (örneğin, "-blah bir Gnu uzantısıdır ve her yerde çalışmaz").
Hennes

3

Temp dizini yarattım. Ve dizinde, dahil edilecek olan tüm dosyalara sembolik bağlantılar oluşturuldu. Sonra katran -h -C yaptım. böylece tüm dosyalar (linkler değil, içerikleri) arşive istenen adla eklenir.


1

Bunlar tarball içeriği ise --strip-components, dosyalardan önceki 2 seviyeyi kaldırmak için GNU tar seçeneğini kullanabilirsiniz.


Sadece seçeneğim var --strip-pathama onu kullanmak hiçbir şeyi değiştirmeyecek.

1

Dizini geçici olarak değiştirmenin bir başka yolu da cdve tarkomutlarını parantez içine almaktır ( ):

(cd example/super_user; tar -cvf ../../result.tar *)

Bunun avantajı, blok bittiğinde her zaman dolaylı olarak orijinal dizine geri dönmenizdir. yani, gerek yok pushdpopdbloklar veya nereye gideceğinizi takip cdetmek.


0
pushd example/super_user
tar -cf output.tar Output.*
popd

pushd, geçerli dizin yolunu DIRyığına iter ve içerik klasörüne taşır. Ardından, kullanarak orijinal dizine geri dönün popd.

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.