Wget'ın indirilen dosyaları sorgu dizesini içermemesi için yeniden adlandırmasını nasıl sağlayabilirim?


32

Bir siteyi wget ile indiriyorum ve bağlantıların birçoğunun kendilerine eklenmiş sorguları var.

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

Bunun gibi bir sürü dosyayla bitirdim:

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

Sonunda olmak istediğim şey:

1.mp3
2.mp3
3.mp3

Bunların hepsi ubuntu linux'da gerçekleşiyor ve ben 1.10.2 yazıyordum.

Her şeyi yeniden adlandırmak için bir komut dosyası yoluyla her şeyi aldıktan sonra bunu yapabileceğimi biliyorum. Ancak ben gerçekten wget içinden bir çözüm istiyorum, bu yüzden indirme işlemi sırasında doğru isimleri görebiliyorum.

Birisi bunu çözmeme yardım edebilir mi?


Sorunuzu www.stackoverflow.com adresine gönderin.
Deniz Zoeteman

3
@TutorialPoint neden? soru bir-içine-yapılacak-yolu-yapmanın yolunu arıyor, SO onu buraya geri taşıyacaktı.
quack quixote

Eh, yapmak için hiçbir şekilde-içinde-yapmak-it-it-yok
ayrnieu

1
@ayrnieu: tek komutta değil, hayır. ve bir yardımcı olmadan. fakat kesinlikle n + 1 wgetkomutları ile yapabilirsiniz (daha az değilse).
quack quixote

Yanıtlar:


24

Sunucu nazikse, istemcinize doğru dosya adını bildirmek için indirme işlemine bir Content-Disposition başlığı yapıştırıyor olabilir. Wget'in son dosya adı için o başlığı dinlemesini söylemek, şu kadar basittir:

wget --content-disposition

Bu özelliği kullanmak için yeni bir wget versiyonuna ihtiyacınız olacak.

'/ Etc / passwd' bir dosya adı olduğunu iddia eden bir sunucuyu ne kadar iyi idare ettiği hakkında hiçbir fikrim yok.


Şüphesiz bazı durumlar için işe yaradığı için bu cevaba sahip değilim. Ne yazık ki, benim için tür sürümleri olan cloudfront tarafından bakılan bazı sayfalar için işe yaramadı ?v=blah. Bunlar olmadan bir belge talep etmenin belirli bir yolu olabilir, bilmiyorum ama bir tane bulamadım, bu nedenle diğer cevaplardan biri gibi bir şey böyle bir durumda gerekli olabilir. (Eğer biri soymak için bir yol bilirse - ya da Cloudfront'a hizmet etmemeyi - v=dizeleri öğrenirseniz , duymak isterim.)
lindes,

17

wgetSorgu dizgilerini yok saymam gerektiğini bildirmem gereken büyük bir toplu işlemi gerçekleştirdikten sonra anladım . Tekrar yapmak istemedim, bu yüzden benim için işe yarayan bu senaryoyu yaptım:

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

Şunu rmqstrve gibi bir dosyaya koyun chmod +x rmqstr :./rmqstr <directory (defaults to .)>

Sorgu dizelerini tüm dosya adlarından tekrar tekrar kaldırır.


2
Sadece gerekli dosyaları sınırlayacak parçayı bulmak için `-name" \? "`
Eklerdim

4

Bence, wgetURL'nin belirttiğinden farklı bir dosya adı kaydetmek için -O filenameargümanı kullanmanız gerekir . Bu yalnızca tek bir URL verdiğinizde istediğinizi yapar - birden fazla URL ile, indirilen tüm içerik sona erer filename.

Ama bu gerçekten cevap. Hepsini bir wgetkomutta yapmaya çalışmak yerine, birden çok komut kullanın. Şimdi iş akışınız:

  1. wgetBağlantılarınızı içeren temel HTML dosyalarını almak için çalıştırın ;
  2. URL’leri ayrıştır;
  3. Foreach URL'si biten mp3,
    1. bir dosya adı almak için URL’yi işle (ör http://foo/bar/baz.mp3?gargle=blaster.baz.mp3
    2. (isteğe bağlı) dosya adının mevcut olmadığını kontrol edin
    3. koşmak wget <URL> -O <filename>

Bu, sorununuzu çözer, ancak şimdi, mp3URL’lerinizi bulmak için temel dosyaları nasıl alacağınıza karar vermeniz gerekir .

Aklında belirli bir site / temel URL var mı? 1. ve 3. adımlar somut bir örnekle ele alınması daha kolay olacaktır.


1

bu yüzden indirme gerçekleşirken doğru isimleri görebilirim.

TAMAM. Normalde yaptığınız gibi wget kullanın; normalde kullandığınız wget sonrası betiği kullanın, ancak wget'ın çıktısını işleyerek gözlerinizde daha kolay hale getirin:

#! /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

Bu, ?foo=barindirdiğiniz şekli göstermeye devam edecektir ancak adın geri kalanını parlak camgöbeğinde gösterecektir.


Bu, görüntülenen dosya adlarının sorununu çözmektedir, ancak OP ayrıca son dosya adının sorgu dizgisine sahip olmamasını da istemektedir.
Michael Mior

1

@Gregory Wolf ile benzer bir yaklaşımım var çünkü kodu her zaman şöyle hata mesajları üretti:

mv: './file' ve './file' aynı dosyadır.

Böylece ilk önce dosyayı taşımadan önce dosya adında bir sorgu dizgisi olup olmadığını kontrol ederim:

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

Bu, her dosyayı tekrar tekrar kontrol eder ve varsa, dosya adlarındaki tüm sorgu dizelerini siler.


0

Bir siteyi klonlamak için oluşturduğum bu iki komuta bakın ve klon tamamlandıktan sonra ikinci komutu çalıştırabilirsiniz.

İkinci komut klonun tamamına bakacak, " ? " Dosya deseni adlarını arayacak ve sorgu dizesini dosya adından kaldıracaktır.

# 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

( GitHub Gist'te görün .)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.