it-swarm-id.com

Ekstrak beberapa file .tar.gz dengan satu panggilan tar

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

Saya pengguna Unix yang berpengalaman selama beberapa tahun dan tentu saja saya tahu bahwa Anda dapat menggunakan for atau find atau hal-hal seperti itu untuk memanggil tar satu kali untuk setiap arsip yang Anda inginkan untuk mengekstrak, tetapi saya tidak dapat membuat baris perintah yang berfungsi yang menyebabkan tar saya mengekstrak dua file .tar.gz sekaligus. (Dan tidak, tidak ada yang salah dengan for, saya hanya bertanya apakah mungkin untuk melakukannya tanpa.)

Saya mengajukan pertanyaan ini karena penasaran, mungkin

  • ada garpu aneh tar di suatu tempat yang mendukung ini
  • ada yang tahu cara menggunakan -M parameter yang tar sarankan kepada saya ketika saya mencoba tar -zxv -f a.tgz -f b.tgz
  • kita semua buta dan itu sangat mudah dilakukan - tetapi saya tidak dapat menemukan petunjuk di web yang tidak memanfaatkan for atau find atau xargs atau yang Suka.

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

Sunting: Saya diarahkan ke jawaban untuk pertanyaan ini di Stack Overflow yang mengatakan dengan sangat rinci bahwa itu tidak mungkin tanpa melanggar sintaks tar saat ini, tapi saya rasa itu tidak benar. Menggunakan tar -zxv -f a.tgz -f b.tgz atau tar -zxv --all-args-are-archives *.tar.gz tidak akan merusak sintaks yang ada, imho.

39
scy

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)
43
polynomial

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
29
Ratnesh

Anda perlu menggunakan loop. Itu tidak akan merusak sintaks baris perintah tar untuk memungkinkan banyak -f pilihan, tetapi akan membutuhkan penambahan kode untuk memproses beberapa arsip secara berurutan, dengan semua jenis kondisi Edge (Apa yang terjadi jika arsip di tengah cacat? Bisakah arsip menggunakan mekanisme kompresi yang berbeda? Bisakah Anda memiliki banyak -C options (opsi tar GNU untuk mengekstrak ke direktori tertentu), juga? Bagaimana dengan -K (opsi tar GNU untuk memulai dengan nama anggota tertentu)? ...).

Satu kemungkinan menghindari loop for adalah menginstal dan mengaktifkan AVFS , --- Fuse filesystem yang menyediakan akses transparan ke arsip. Setiap arsip /path/to/archive berfungsi ganda 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

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

0
zjengjie