ekstraksi tar tergantung pada nama file?

33

Saya sering mengunduh tarbal dengan wget dari sourceforge.net.

File yang diunduh kemudian dinamai, misalnya SQliteManager-1.2.4.tar.gz?r=http:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F&ts=1305711521&use_mirror=switch

Ketika saya mencoba

tar xzf SQliteManager-1.2.4.tar.gz\?r\=http\:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F\&ts\=1305711521\&use_mirror\=switch

Saya menerima pesan kesalahan berikut:

tar (child): Cannot connect to SQliteManager-1.2.4.tar.gz?r=http: resolve failed

gzip: stdin: unexpected end of file
tar: Child returned status 128
tar: Error is not recoverable: exiting now

Setelah mengubah nama file ke foo.tar.gzekstraksi berfungsi dengan sempurna.

Apakah ada cara, bahwa saya tidak dipaksa untuk mengganti nama setiap kali file target sebelum diekstraksi?

Casper
sumber

Jawaban:

50

Alasan untuk kesalahan yang Anda lihat dapat ditemukan di dokumentasi tar GNU :

Jika nama file arsip menyertakan titik dua (':'), maka itu dianggap sebagai file di komputer lain [...]

Yaitu, ia mengartikan SQliteManager-1.2.4.tar.gz?r=httpsebagai nama host dan mencoba menyelesaikannya ke alamat IP, maka kesalahan "tekad gagal".

Dokumentasi yang sama selanjutnya mengatakan:

Jika Anda perlu menggunakan file yang namanya menyertakan titik dua, maka perilaku tape drive jarak jauh dapat dihambat dengan menggunakan opsi '--force-local'.

camh
sumber
Catatan yang --force-localharus ditambahkan sebelum f... ketika saya pertama kali mencoba ini memberi saya pesan kesalahan tentang bagaimana tidak ada file seperti itu --force-local. Mungkin ini terlalu "tidak," tetapi saya tidak mengenali kesalahan yang saya buat sampai 5 menit kemudian.
ArtOfWarfare
@ ArtOfWarfare: fmengambil argumen yang merupakan tarfile. Anda tidak dapat menempatkan --force-localantara fargumen dan argumennya, tetapi itu adalah standar untuk semua program, bukan adil tardan tidak adil -f. Anda dapat menempatkan --force-localsetelah fselama itu juga setelah argumen untuk f.
camh
seperti yang saya katakan di komentar saya, mungkin itu terlalu "tidak ada". Saya menggunakan tar seperti ini tar -cvzf ...dan bahkan tidak berpikir tentang apa yang benar-benar dilakukan setiap bendera 99% dari waktu - hanya refleksif bahwa itulah cara saya membuat tar.gz.
ArtOfWarfare
Pada catatan ini, untuk lebih membantu pada apa yang dikatakan kedua orang ini (@ArtOfWarfare dan @camh) adalah contoh: tar zxvf C:\Users\jdoe\Documents\tarfile.tgz --force-local
Dr. Dan
6

Saat Anda mengunduh dengan wget, tentukan nama file keluaran dengan -Oopsi.

wget "http://domain.com/file.tgz?crazy=args&stuff=todelete" -O file.tgz

Ini akan menyebabkan file untuk menyimpan dengan nama file yang diberikan dan menghemat masalah Anda atau mengubah nama itu. Dan tidak, Anda bukan satu-satunya yang berharap sourcefourge tidak akan sebodoh itu untuk membagikan file dengan parameter url yang dilampirkan.

Caleb
sumber
Ini bukan salah SourceForge, tapi wgetitu. Gunakan --content-dispositionflag untuk menyimpan dengan nama file yang ditentukan server (tapi waspadalah terhadap implikasi keamanan, karena SourceForge kemudian dapat menulis ke nama file yang sewenang-wenang).
pcworld
4

Unduh menggunakan

wget --trust-server-names URL

Dengan begitu wget akan menyimpan dengan nama file yang benar. Secara default menggunakan komponen terakhir di URL

Untuk misalnya

wget --trust-server-names http://sourceforge.net/projects/sqlitemanager/files/sqlitemanager/1.2.4/SQliteManager-1.2.4.tar.gz/download
pemikir bebas
sumber
4

Seperti dikutip di atas, :kolom (membuat) tarberpikir itu adalah file jarak jauh. Jadi kita perlu menegakkan fakta itu lokal.

Gagal

$ tar czf "back$(date -u +"%H:%M").tar.gz" ./
tar (child): Cannot connect to back10: resolve failed
tar: Child returned status 128
tar: Error is not recoverable: exiting now

Larutan

Menjelaskan fakta bahwa ini adalah file lokal dengan menambahkan ./(direktori saat ini) dan mengutip dengan benar:

$ tar czf ./"back$(date -u +'%H:%M').tar.gz" ./
tar: .: file changed as we read it

Peringatan ini karena fakta yang saya buat di direktori sumber.

Édouard Lopez
sumber
Jauh lebih baik daripada menggunakan bendera panjang. Saya juga percaya bahwa pengunduhan host jarak jauh adalah opsi yang tidak berguna sementara ada alat khusus untuk mencapai tujuan ini.
Alireza Mohamadi
3

Untuk file yang sudah diunduh, ini seharusnya bekerja:

tar xzf - < SQliteManager-1.2.4.tar.gz*
Jlliagre
sumber