Ekstrak beberapa file .tar.gz dengan satu panggilan tar

35

Saya bertanya-tanya apakah (dan, tentu saja, bagaimana) adalah mungkin untuk mengatakan taruntuk mengekstrak beberapa file dalam sekali jalan.

Saya adalah pengguna Unix yang berpengalaman selama beberapa tahun dan tentu saja saya tahu bahwa Anda dapat menggunakan foratau findatau hal-hal seperti itu untuk memanggil tarsatu kali untuk setiap arsip yang ingin Anda ekstrak, tetapi saya tidak dapat menghasilkan baris perintah yang berfungsi yang menyebabkan saya taruntuk mengekstrak dua file .tar.gz sekaligus. (Dan tidak, tidak ada yang salah dengan itu for, aku hanya bertanya apakah mungkin untuk melakukannya tanpanya.)

Saya mengajukan pertanyaan ini karena penasaran, mungkin

  • ada garpu aneh di tarsuatu tempat yang mendukung ini
  • seseorang tahu cara menggunakan -Mparameter yang tardisarankan kepada saya ketika saya mencobatar -zxv -f a.tgz -f b.tgz
  • kita semua buta dan itu sangat mudah dilakukan - tetapi saya tidak dapat menemukan petunjuk apa pun di web yang tidak memanfaatkan foratau findatau xargssejenisnya.

Tolong jangan balas dengan tar -zxvf *.tar.gz(karena itu tidak bekerja) dan hanya membalas dengan "tidak bekerja" jika Anda benar-benar yakin tentang hal itu (dan mungkin juga memiliki penjelasan yang bagus mengapa ).

Sunting: Saya diarahkan ke jawaban untuk pertanyaan ini di Stack Overflow yang mengatakan dengan sangat terperinci bahwa itu tidak mungkin tanpa melanggar tarsintaksis saat ini , tetapi saya tidak berpikir itu benar. Menggunakan tar -zxv -f a.tgz -f b.tgzatau tidak tar -zxv --all-args-are-archives *.tar.gzakan merusak sintaks yang ada, imho.

scy
sumber
Karena penasaran, apa situasi yang menyebabkan Anda mulai berpikir tentang cara menghindari konstruksi perulangan?
unclejamil
1
FYI: GNU tar mendukung arsip tar multi-volume dengan -Mparameter.
Steve-o
1
unclejamil: Saya sedang menulis HowTo dan salah satu langkah di dalamnya melibatkan membongkar beberapa file terkompresi (.tar.bz2, .tar.gz, .zip). Dan karena itu adalah HowTo, saya bertanya-tanya seperti apa baris perintah yang paling elegan untuk dilakukan. :)
scy

Jawaban:

39

Ini mungkin, sintaksnya cukup mudah:

$ cat *.tar | tar -xvf - -i

Opsi -i mengabaikan EOF di akhir arsip tar, dari halaman manual:

-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)
jumlahnya banyak
sumber
1
Ini sepertinya bekerja untuk saya. Perintah yang tepat saya digunakan adalah: cat *.tar.bz2 | tar -ixjv. Terima kasih!
scy
1
<Untuk tgz> cat * .tgz | tar -xzvf - -i -C / tujuan / <or> untuk file di * .tgz; lakukan tar -xzvf $ file -C / destination /; selesai
Ferroao
27

untuk * .tar.gz

for file in *.tar.gz; do tar -zxf "$file"; done

untuk * .tar.bz2

for file in *.tar.bz2; do tar -jxf "$file"; done

untuk * .tar.xz

for file in *.tar.xz; do tar -Jxf "$file"; done
Ratnesh
sumber
1
Perbaiki format di sini, dan ini akan lebih mudah dibaca.
eyoung100
ini bagus. formatnya juga bagus karena tampilannya di terminal
smatthewenglish
1
Jangan lupa memberi tanda kutip $filejika file Anda memiliki nama dengan spasi.
Alexander Revo
Ini tidak benar-benar menjawab pertanyaan apakah mungkin untuk mengekstrak banyak arsip menggunakan satu permintaan tar. Lebih lanjut, pengguna mengatakan mereka sudah terbiasa dengan cara menggunakan for-loop untuk beralih pada satu set file.
Kusalananda
2

Anda perlu menggunakan loop. Itu tidak akan melanggar tarsintaks baris perintah untuk membolehkan beberapa -fopsi, tetapi akan membutuhkan penambahan kode untuk memproses beberapa arsip secara berurutan, dengan semua jenis kondisi tepi (Apa yang terjadi jika arsip di tengah salah bentuk? Dapatkah arsip menggunakan berbeda mekanisme kompresi? Dapatkah Anda memiliki banyak -Copsi (opsi tar GNU untuk mengekstrak ke direktori tertentu), juga? Bagaimana dengan -K (opsi tar GNU untuk memulai dengan nama anggota tertentu)? ...).

Satu kemungkinan menghindari forloop adalah menginstal dan mengaktifkan AVFS , sistem file FUSE yang menyediakan akses transparan ke arsip. Setiap arsip /path/to/archiveberfungsi sebagai direktori ~/.avfs/path/to/archive#. Jika Anda ingin mencocokkan arsip dengan wildcard, ada rintangan menambahkannya #ke pertandingan wildcard; itu bisa dilakukan di zsh.

mountavfs
cp -p ~/.avfs$PWD/{a,b}.tgz\#/* /destination
cp -p ~/.avfs/path/to/source/*.tgz(e\''REPLY=$REPLY\#'\')/* /destination
Gilles 'SANGAT berhenti menjadi jahat'
sumber
-1

find . -name "*.tar.gz" -exec tar xzf {} \;

zhengjie
sumber
apa fungsinya?
Pierre.Vriens
1
Ini memperkenalkan tar panggilan loop implisit sekali untuk setiap file yang ditemukan, dan pengguna mengatakan mereka sudah tahu bagaimana melakukan ini.
Kusalananda
maaf tidak membaca pertanyaan dengan hati-hati, saya hanya mencari cara untuk mengekstrak beberapa paket tar, baca jawaban di atas dan berpikir menggunakan find akan lebih mudah.
zjengjie