#!/bin/sh
orig=$1
var=${orig%.jpg}
var=`echo "$var" | grep -o "[0-9][0-9]$"`
cutten=${orig%[0-9][0-9].jpg}
sequence='{1,'
for i in `seq 2 $(( $var - 1 ))`; do
sequence=$sequence$i","
done
output=$cutten$sequence$var"}.jpg"
echo "$output"
#wget "$output"
다음과 같은 img 링크를 사용하여 *1.jpg 파일을 *20.jpg로 http://foo.bar/some-image-20.jpg
반환합니다.
http://foo.bar/some-image-{1,2,3,4,5,…,18,19,20}.jpg
에코에서 wget으로 실행하면 예상대로 작동합니다(출력은 위와 같음).
-- (Date/Time) -- http://foo.bar/some-image-%7B1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20%7D.jpg
(Proceeds to resolve this whole one link, and fails)
거의 "{"를 "%7B"로 바꾸고 "}"를 "%7D"로 바꿉니다. 어떤 아이디어가 있나요?
답변1
와일드카드 다운로드를 지원하는 웹 서버는 없습니다. 각 URL을 개별적으로 가져와야 합니다.
다음과 같이 원본 스크립트를 최대한 많이 유지하세요.
#!/bin/sh
orig=$1
var=${orig%.jpg}
var=$(echo "$var" | grep -o "[0-9][0-9]$")
cutten=${orig%[0-9][0-9].jpg}
for i in $(seq 1 $(($var - 1))) ; do
echo $cutten$i.jpg
done | wget -i -
이는 파일(이 경우 stdin)에서 가져올 URL 목록을 읽는 wget의 옵션을 활용하므로 -i
파일 목록을 wget으로 파이프할 수 있습니다.
(실행하기 전에 다운로드할 내용을 보려면 wget -i -
로 바꾸십시오 cat
.)
답변2
http://foo.bar/some-image-{1,2,3}.jpg
단어 목록에 대한 bash 소스 구문 입니다 http://foo.bar/some-image-1.jpg
. 소스 구문은 변수가 확장될 때 발생하는 것이 아니라 스크립트에 입력한 내용을 의미합니다. 실행하려는 명령을 표시합니다.http://foo.bar/some-image-2.jpg
http://foo.bar/some-image-3.jpg
echo "$output"
wget http://foo.bar/some-image-{1,2,3}.jpg
URL에서는 중괄호가 유효하지 않기 때문에wget
인코딩As %7B
및 %7D
. 이것은 귀하의 질문과 관련이 없습니다. 서버는 기존 파일을 참조하지 않는 URL만 봅니다.
명령줄에서 3개(내 경우에는 20개)의 서로 다른 URL을 wget에 전달해야 합니다. eval
bash를 사용하여 변수 내용을 소스 코드로 구문 분석하여 중괄호 확장 기능을 활용할 수 있지만 먼저 목록을 작성하는 것이 더 쉽습니다. 중괄호를 사용하여 문자열을 작성하는 것보다 어렵지 않습니다.
#!/bin/sh
suffix=${1##*[0-9]}
prefix=${1%"$suffix"}
last=${prefix##*[!0-9]}
prefix=${prefix%"$last"}
while [ "$last" -gt 1 ]; do
last=$((last-1))
set -- "$prefix$last$suffix" "$@"
done
wget "$@"