tar - çıkartma dizin yapısını çıkar


34

unzipşık bir seçeneğe sahip -j, burada arşivin dizin yapısı atılır ve tüm dosyalar aynı dizine çıkarılır.

tarAynı şekilde çalışmanın bir yolu var mı ? Adam sayfasındaki hiçbir şey öyle görünmüyor.

Peki bunu yapacak alternatif bir alternatif, tercihen Özgür Yazılım aracı var mı?


Yanıtlar:


79

GNU katran featuritis yaşıyor, bu yüzden doğal olarak bunun için bazı seçenekleri var.
http://www.gnu.org/software/tar/manual/html_node/transform.html

Yalnızca birkaç yol parçasını kaldırmak istiyorsanız, o zaman --strip-components=nya --strip=nda sık sık yapacak:

 tar xvzf tgz --strip=1

Ancak, çıkartılacak dosyaları regex-yeniden yazmak da mümkündür (bayraklar değiştirici ile ereg kabul eder --transformveya --xformkabul /xedilir):

 tar xvzf tgz --xform='s#^[^/]+#.#x'
                 # or 's#^.+/##x' for discarding all paths

Katran listelemek için ek --show-transformedseçeneğe ihtiyacınız vardır :

 tar tvzf tgz --show-transformed --strip=1 --xform='s/abc/xyz/x'

Yeniden yazma seçeneklerinin yalnızca ayıklamak için değil, paketleme için de işe yaradığına inanıyorum. Ama paxbelli ki daha hoş bir sözdizimi var.


4
Neden olmasın s#.*/##?
l0b0

3
- strip az önce günümü yaptı. Teşekkürler!
SamStephens

--stripos x tar man sayfasında bahsedilmedi, ama yine de çalışıyor, teşekkürler!
slf 19

3
Kabul edilen cevaptan çok daha iyi.
Klaatu von Schlacker

--stripve arasında bir fark var --strip-componentsmı?
Joel Berkeley

13

Bunu iki adımda kolayca yapabilirsiniz. Gerektiği gibi uyarlayın:

$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree

Bu nasıl yaparım ( find -exec mv -iyerine kullanarak find | xargs) .... basit adımlar benim için yapmak için bir komut dosyası etrafında taşımak zorunda kalmadan herhangi bir sistemde tekrarlayabilirsiniz.
quix quixote

1
+1, tmpdir=$( mktemp -d )geçici dizinler oluştururken kullanışlıdır
sorki

8

pax yapabilir:

pax -v -r -s '/.*\///p' < archive.tar

veya

zcat archive.tar.gz | pax -v -r -s '/.*\///p'

İsim değiştirme işlemini önce -rseçeneği atlayarak kontrol edebilirsiniz .


1

Hiçbir şey yüklemenizi gerektirmeyen olası bir çözüm.

  1. tar tvftarball'dan tüm dosyaları kapmak için a kullanın
  2. Bu dosyaları tek tek ayıklayın - stdout'a katıştırmalı ve $ dosya adına yönlendirmelisiniz

    tar -tvf $1 | grep -v "^d" | \
                  awk '{for(i=6;i<NF+1;i++) {printf "%s ",$i};print ""}' |\
                  while read filename
                  do
                     tar -O -xf $1 "$filename" > `basename "$filename"`
                  done
    

extract.sh olarak kaydedin ve olarak çalıştırın extract.sh myfile.tar. Ayrıca, tarball'dan çekilen dizinlerde karşılaşılan kopya dosya adlarının üzerine yazacaktır.


Aslında ben sadece evde bir dir ağacı üzerinde test ettim & boşluk içeren dosyalarda başarısız olur. Bir güncelleme gönderemez miyim bakalım.
DaveParillo

Sabitledi, ama neredeyse eskisi gibi değil.
DaveParillo

-1
tar xf foo.tar.gz foo/path/to/file/bar.mp3 -O > bar.mp3

Bu -Oseçenek bir dosyayı standart >çıktıya çıkarır ve çıktıyı bir dosyaya yönlendirir. Yani benim örneğimde foo.mp3 ayıklamak ve bar.mp3 içine yönlendirme. Dosya adları isteğe bağlı.

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.