tar - ekstrak struktur direktori membuang

34

unzipmemiliki opsi yang bagus -j, di mana struktur direktori arsip dibuang, dan semua file diekstraksi ke direktori yang sama.

Apakah ada cara untuk membuat tarpekerjaan dengan cara yang sama? Tidak ada di halaman manual yang menunjukkan demikian.

Jadi, apakah ada alat alternatif, lebih disukai Perangkat Lunak Bebas, yang akan melakukan itu?

Benji XVI
sumber
Terkait: Mengekstrak Isi arsip tar ke direktori induk .
G-Man Berkata 'Reinstate Monica'

Jawaban:

79

GNU tar hidup dengan featureitis, jadi tentu saja ada beberapa opsi untuk itu.
http://www.gnu.org/software/tar/manual/html_node/transform.html

Jika Anda hanya ingin menghapus beberapa segmen jalur, maka --strip-components=natau --strip=nakan sering dilakukan:

 tar xvzf tgz --strip=1

Tetapi juga dimungkinkan untuk regex-menulis ulang file yang akan diekstraksi (flag adalah --transformatau --xformdan menerima kesalahan dengan /xmodifer):

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

Untuk mendaftarkan tar, Anda memerlukan --show-transformedopsi tambahan :

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

Saya percaya opsi penulisan ulang juga berfungsi untuk pengemasan, bukan hanya untuk mengekstraksi. Tetapi paxjelas sintaksisnya lebih bagus.

mario
sumber
4
Mengapa tidak s#.*/##?
l0b0
3
--strip baru saja membuat hariku. Terima kasih!
SamStephens
--striptidak disebutkan di halaman manual os x tar, tetapi tetap berfungsi, terima kasih!
slf
3
Jauh lebih baik daripada jawaban yang diterima.
Klaatu von Schlacker
apakah ada perbedaan antara --stripdan --strip-components?
Joel Berkeley
13

Anda dapat melakukannya dengan cukup mudah dalam dua langkah. Beradaptasi seperlunya:

$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree
MikeyB
sumber
ini adalah bagaimana saya akan melakukannya (menggunakan find -exec mv -ialih-alih find | xargs) .... langkah-langkah sederhana yang dapat saya ulangi pada sistem apa pun tanpa harus membawa skrip untuk melakukannya untuk saya.
quack quixote
1
+1, tmpdir=$( mktemp -d )berguna saat membuat direktori sementara
sorki
8

pax dapat melakukannya:

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

atau

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

Anda dapat memeriksa operasi penggantian nama terlebih dahulu dengan menghilangkan -ropsi.

hfs
sumber
1

Solusi yang mungkin yang tidak memerlukan instalasi apa pun.

  1. gunakan tar tvfuntuk mengambil semua file dari tarball
  2. Ekstrak file-file tersebut satu per satu - miliki ekstrak tar untuk stdout & redirect ke $ filename

    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
    

simpan sebagai extract.sh dan jalankan sebagai extract.sh myfile.tar. Itu juga akan menimpa nama file duplikat yang ditemui di direktori yang ditarik dari tarball.

DaveParillo
sumber
Sebenarnya saya baru saja mengujinya pada beberapa pohon dir di rumah & Gagal pada file yang berisi spasi. Saya akan melihat apakah saya tidak dapat memposting pembaruan.
DaveParillo
Memperbaikinya, tapi itu tidak secantik dulu.
DaveParillo
-1
tar xf foo.tar.gz foo/path/to/file/bar.mp3 -O > bar.mp3

The -Opilihan ekstrak file untuk keluar standar, dan >pengalihan bahwa output ke dalam file. Jadi dalam contoh saya, saya mengekstrak foo.mp3 dan mengalihkannya ke bar.mp3. Nama file sewenang-wenang.

Klaatu von Schlacker
sumber