2011-12-20 16 views
13

Piszę skrypt bash i muszę uzyskać nazwę pobranego pliku używając wget i umieścić nazwę na $ stringwget: pobrane nazwa pliku

na przykład gdybym pobierania tego pliku poniżej, aby umieścić to nazwa mxKL17DdgUhcr.jpg do $ string

wget http://pics.sitename.com/images/191211/mxKL17DdgUhcr.jpg 
45439 (44K) [image/jpeg] 
Saving to: «mxKL17DdgUhcr.jpg» 

100%[===================================================================================================>] 45 439  --.-K/s в 0s 

2011-12-20 12:25:33 (388 MB/s) - «mxKL17DdgUhcr.jpg» saved [45439/45439] 

Odpowiedz

26

Użyj polecenia basename, aby wyodrębnić nazwę pliku z adresu URL. Na przykład:

url=http://pics.sitename.com/images/191211/mxKL17DdgUhcr.jpg 
filename=$(basename "$url") 
wget "$url" 
+0

Pracował jak czar. Wielkie dzięki! –

+2

Ostrzeżenie: nie będzie działać w przypadku adresów URL zawierających przekierowania lub treści dynamiczne. Aby uzyskać prawidłowe rozwiązanie, patrz odpowiedź est. –

11

wystarczy podać nazwę pliku przed pobraniem, z -O opcja wget:

wget -O myfile.html http://www.example.com/ 
2

Możesz być jawne o nazwie jak ten:

url='http://pics.sitename.com/images/191211/mxKL17DdgUhcr.jpg' 
file=`basename "$url"` 
wget "$url" -O "$file" 
0

Chyba już pełny adres URL pliku gdzieś w zmiennej? Użyj interpretacji parametrów bash rozebrać prefiks:

echo ${url##*/} 
1
~ $ URL='http://pics.sitename.com/images/191211/mxKL17DdgUhcr.jpg' 
~ $ echo ${URL##*/} 
mxKL17DdgUhcr.jpg 
~ $ wget $URL -O ${URL##*/} 
--18:34:26-- http://pics.sitename.com/images/191211/mxKL17DdgUhcr.jpg 
      => `mxKL17DdgUhcr.jpg' 
-2

Więc chcesz dać plik/nazwa obrazu jako parametru

spróbować

echo -n "Give me the name of file in http://pics.sitename.com/images/191211/ :" 

read $string 

sudo wget http://pics.sitename.com/images/191211/$string ;; 

myślę, że to mogłoby pomóc

27
wget --server-response -q -O - "https://very.long/url/here" 2>&1 | 
    grep "Content-Disposition:" | tail -1 | 
    awk 'match($0, /filename=(.+)/, f){ print f[1] }') 

Jest to poprawna wersja, ponieważ może być kilka przekierowań 301/302, a na końcu nagłówek Content-Disposition: do ustawiania nazwy pliku

Nazwa pliku zgadywania na podstawie adresu URL nie zawsze jest poprawna.

+2

Podoba mi się to podejście, ale niestety awk w pochodnych Debiana (Ubuntu, np.) Nie obsługuje trzeciego argumentu w 'match'. – jtravaglini

+0

chociaż nie zawsze jest idealnie dokładne, jest to prawidłowe podejście. – diedthreetimes

+1

W Ubuntu możesz użyć: 'wget --server-response -q -O -" https: //very.long/url/here "2> & 1 | grep "Content-Disposition:" | ogon -1 | awk -F "filename =" '{print $ 2}' ' –

2

Do obsługi URL-zakodowane nazwy plików:

URL="http://www.example.com/ESTAD%C3%8DSTICA(2012).pdf" 
BASE=$(basename ${URL})    # ESTAD%C3%8DSTICA(2012).pdf 
FILE=$(printf '%b' ${BASE//%/\\x}) # ESTADÍSTICA(2012).pdf 
wget ${URL}