Bagaimana saya bisa membuat wget mengganti nama file yang diunduh untuk tidak memasukkan string kueri?

32

Saya mengunduh situs dengan wget dan banyak tautan memiliki kueri yang menyertainya, jadi ketika saya melakukan ini:

wget -nv -c -r -H -A mp3 -nd http://url.to.old.podcasts.com/

Saya berakhir dengan banyak file seperti ini:

1.mp3?foo=bar
2.mp3?blatz=pow
3.mp3?fizz=buzz

Yang ingin saya akhiri adalah:

1.mp3
2.mp3
3.mp3

Ini semua terjadi di linux ubuntu dan saya punya wget 1.10.2.

Saya tahu saya bisa melakukan ini setelah saya mendapatkan semuanya melalui skrip untuk mengubah nama semuanya. Namun saya benar-benar menginginkan solusi dari dalam wget sehingga saya dapat melihat nama yang benar ketika unduhan sedang terjadi.

Adakah yang bisa membantu saya mengungkap ini?

Keith Twombley
sumber
Posting pertanyaan Anda di www.stackoverflow.com.
Deniz Zoeteman
3
@TutorialPoint mengapa? pertanyaannya adalah mencari dalam-cara-wget-cara-untuk-melakukannya, SO hanya akan bermigrasi kembali ke sini.
Quack quixote
Nah, tidak ada dalam-wget-cara-untuk-do-it
ayrnieu
1
@ayrnieu: tidak dalam satu perintah, tidak. dan bukan tanpa pembantu. tetapi Anda tentu dapat melakukannya dengan sesedikit n + 1 wgetperintah (jika tidak lebih sedikit).
Quack quixote

Jawaban:

24

Jika servernya baik, mungkin menempel pada header Content-Disposition pada unduhan yang memberi tahu klien Anda nama file yang benar. Memberitahu wget untuk mendengarkan tajuk itu untuk nama file terakhir semudah:

wget --content-disposition

Anda memerlukan versi agak baru untuk menggunakan fitur ini.

Saya tidak tahu seberapa baik menangani server yang mengklaim nama file '/ etc / passwd'.

Filox
sumber
Saya tidak punya masalah dengan jawaban ini, karena tidak diragukan lagi berfungsi untuk beberapa situasi. Sayangnya, itu tidak bekerja untuk saya sehubungan dengan beberapa CloudFront halaman -served dengan ?v=blahjenis versioning di dalamnya. Mungkin ada beberapa cara khusus cloudfront untuk meminta dokumen tanpa ini, saya tidak tahu, tetapi saya gagal menemukannya, jadi sesuatu seperti salah satu jawaban lain mungkin diperlukan dalam kasus seperti itu. (Jika ada yang tahu cara melucuti - atau membuat Cloudfront tidak melayani - v=senar, saya akan senang mendengarnya.)
lindes
17

Saya menyadari setelah memproses sejumlah besar yang seharusnya saya perintahkan wgetuntuk mengabaikan string kueri. Saya tidak ingin melakukannya lagi jadi saya membuat skrip ini yang berfungsi untuk saya:

# /bin/bash
for i in `find $1 -type f`
do
    mv $i `echo $i | cut -d? -f1`
done

Masukkan itu ke dalam file like rmqstrdan chmod +x rmqstr Syntax:./rmqstr <directory (defaults to .)>

Ini akan menghapus string kueri dari semua nama file secara rekursif.

Gregory Wolf
sumber
2
Saya akan menambahkan `-nama" \? "` Untuk menemukan bagian untuk membatasi hanya untuk file yang diperlukan :)
Arkadiusz 'flies' Rzadkowolski
4

Saya pikir, agar dapat wgetmenyimpan sebagai nama file yang berbeda dari yang ditentukan URL, Anda perlu menggunakan -O filenameargumen. Itu hanya melakukan apa yang Anda inginkan ketika Anda memberinya satu URL - dengan banyak URL, semua konten yang diunduh berakhir filename.

Tapi itu benar-benar jawabannya. Alih-alih mencoba melakukan semuanya dalam satu wgetperintah, gunakan beberapa perintah. Sekarang alur kerja Anda menjadi:

  1. Jalankan wgetuntuk mendapatkan file HTML dasar yang berisi tautan Anda;
  2. Parsing untuk URL;
  3. URL Foreach berakhiran mp3,
    1. proses URL untuk mendapatkan nama file (mis. berubah http://foo/bar/baz.mp3?gargle=blastermenjadibaz.mp3
    2. (opsional) periksa apakah nama file tidak ada
    3. menjalankan wget <URL> -O <filename>

Itu memecahkan masalah Anda, tetapi sekarang Anda perlu mencari cara untuk mengambil file-file dasar untuk menemukan mp3URL Anda .

Apakah Anda memiliki URL situs / basis tertentu? Langkah 1 dan 3 akan lebih mudah ditangani dengan contoh nyata.

quack quixote
sumber
1

jadi saya bisa melihat nama yang benar saat unduhan sedang berlangsung.

BAIK. Gunakan wget seperti biasa; gunakan skrip post-wget yang biasa Anda gunakan, tetapi proseskan output wget agar lebih mudah dilihat:

#! /bin/sh
exec wget --progress=bar:force $* 2>&1 | \
  perl -pe 'BEGIN { $| = 1 } s,(?<=`)([^\x27?]+),\e[36;1m$1\e[0m, if /^Saving/'
cgi-cut # rename files

Ini masih akan menunjukkan ?foo=barsaat Anda mengunduh, tetapi akan menampilkan sisa nama dalam cyan cerah.

ayrnieu
sumber
Ini agak memecahkan masalah nama file yang ditampilkan, tetapi OP juga ingin nama file akhir tidak memiliki string kueri.
Michael Mior
1

Saya memiliki pendekatan yang sama dengan @Gregory Wolf karena kodenya selalu membuat pesan kesalahan seperti ini:

mv: './file' dan './file' adalah file yang sama

Jadi saya pertama kali memeriksa apakah ada string kueri dalam nama file sebelum memindahkan file:

for f in $(find $1 -type f); do
    if [ $f = ${f%%\?*} ]; then continue; fi
    mv "${f}" "${f%%\?*}"
done

Ini akan secara rekursif memeriksa setiap file dan menghapus semua string permintaan dalam nama file mereka jika tersedia.

KittMedia
sumber
0

Lihatlah dua perintah yang saya buat untuk mengkloning sebuah situs, dan setelah mengkloning selesai, Anda dapat menjalankan perintah kedua.

Perintah kedua akan melihat di seluruh klon, mencari nama pola file " ? ", Dan akan menghapus string kueri dari nama file.

# Clone entire site.
    wget --content-disposition --execute robots=off --recursive --no-parent --continue --no-clobber http://example.com

# Remove query string from a static resource.
for i in `find $1 -type f -name "*\?*"`; do mv $i `echo $i | cut -d? -f1`; done

(Lihat di GitHub Gist .)

Vijay Padhariya
sumber
-2

Yang lebih mudah adalah ini: /unix/196253/how-do-you-rename-files-specifically-in-a-list-that-wget-will-use

Ini menyarankan metode yang pada dasarnya menggunakan fungsi ganti nama wget (dapat diubah untuk memasukkan direktori) untuk banyak file. Lihat versi kedua yang diusulkan.

robcore
sumber
2
Bisakah Anda mengutip informasi yang relevan dari tautan, jadi kami tahu materi mana yang menurut Anda menjawab pertanyaan ini.
Ramhound