Shell-Script
Google圖片下載 Bash 腳本的 For 循環
我有一個bash 腳本,可以從 Google Images 下載圖片。
這是我使用的命令:
bash getimages.sh 3 rocky%20mountains
該命令將下載 Google 圖片中的第三張圖片。要在 Google 圖片搜尋中下載落基山脈的前 10 張圖片,我使用以下業餘命令:
bash getimages.sh 1 rocky%20mountains && \ bash getimages.sh 2 rocky%20mountains && \ bash getimages.sh 3 rocky%20mountains && \ bash getimages.sh 4 rocky%20mountains && \ bash getimages.sh 5 rocky%20mountains && \ bash getimages.sh 6 rocky%20mountains && \ bash getimages.sh 7 rocky%20mountains && \ bash getimages.sh 8 rocky%20mountains && \ bash getimages.sh 9 rocky%20mountains && \ bash getimages.sh 10 rocky%20mountains
我想在 bash 腳本中加入一個 For 循環,以便下載指定搜尋詞的 20 張圖像。
重擊腳本:
#! /bin/bash # function to create all dirs til file can be made function mkdirs { file="$1" dir="/" # convert to full path if [ "${file##/*}" ]; then file="${PWD}/${file}" fi # dir name of following dir next="${file#/}" # while not filename while [ "${next//[^\/]/}" ]; do # create dir if doesn't exist [ -d "${dir}" ] || mkdir "${dir}" dir="${dir}/${next%%/*}" next="${next#*/}" done # last directory to make [ -d "${dir}" ] || mkdir "${dir}" } # get optional 'o' flag, this will open the image after download getopts 'o' option [[ $option = 'o' ]] && shift # parse arguments count=${1} shift query="$@" [ -z "$query" ] && exit 1 # insufficient arguments # set user agent, customize this by visiting http://whatsmyuseragent.com/ useragent='Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0' # construct google link link="www.google.com/search?q=${query}\&tbm=isch" # fetch link for download imagelink=$(wget -e robots=off --user-agent "$useragent" -qO - "$link" | sed 's/</\n</g' | grep '<a href.*\(png\|jpg\|jpeg\)' | sed 's/.*imgurl=\([^&]*\)\&.*/\1/' | head -n $count | tail -n1) imagelink="${imagelink%\%*}" # get file extention (.png, .jpg, .jpeg) ext=$(echo $imagelink | sed "s/.*\(\.[^\.]*\)$/\1/") # set default save location and file name change this!! dir="$PWD" file="google image" # get optional second argument, which defines the file name or dir if [[ $# -eq 2 ]]; then if [ -d "$2" ]; then dir="$2" else file="${2}" mkdirs "${dir}" dir="" fi fi # construct image link: add 'echo "${google_image}"' # after this line for debug output google_image="${dir}/${file}" # construct name, append number if file exists if [[ -e "${google_image}${ext}" ]] ; then i=0 while [[ -e "${google_image}(${i})${ext}" ]] ; do ((i++)) done google_image="${google_image}(${i})${ext}" else google_image="${google_image}${ext}" fi # get actual picture and store in google_image.$ext wget --max-redirect 0 -qO "${google_image}" "${imagelink}" # if 'o' flag supplied: open image [[ $option = "o" ]] && gnome-open "${google_image}" # successful execution, exit code 0 exit 0
當您可以在循環本身中執行命令時,為什麼要將其合併到腳本中:
for i in `seq 1 20`; do ./getimages.sh $i rocky%20mountains ; done;
但是,如果您確實想要合併,一個快速的方法是將主腳本程式碼移動到另一個函式中並編寫一個 for 循環來呼叫該函式。您的貝司腳本將變為:
#! /bin/bash # function to create all dirs til file can be made function mkdirs { file="$1" dir="/" # convert to full path if [ "${file##/*}" ]; then file="${PWD}/${file}" fi # dir name of following dir next="${file#/}" # while not filename while [ "${next//[^\/]/}" ]; do # create dir if doesn't exist [ -d "${dir}" ] || mkdir "${dir}" dir="${dir}/${next%%/*}" next="${next#*/}" done # last directory to make [ -d "${dir}" ] || mkdir "${dir}" } function getMyImages { # get optional 'o' flag, this will open the image after download getopts 'o' option [[ $option = 'o' ]] && shift # parse arguments count=${1} shift query="$@" [ -z "$query" ] && exit 1 # insufficient arguments # set user agent, customize this by visiting http://whatsmyuseragent.com/ useragent='Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0' # construct google link link="www.google.com/search?q=${query}\&tbm=isch" # fetch link for download imagelink=$(wget -e robots=off --user-agent "$useragent" -qO - "$link" | sed 's/</\n</g' | grep '<a href.*\(png\|jpg\|jpeg\)' | sed 's/.*imgurl=\([^&]*\)\&.*/\1/' | head -n $count | tail -n1) imagelink="${imagelink%\%*}" # get file extention (.png, .jpg, .jpeg) ext=$(echo $imagelink | sed "s/.*\(\.[^\.]*\)$/\1/") # set default save location and file name change this!! dir="$PWD" file="$1_$count" # get optional second argument, which defines the file name or dir if [[ $# -eq 2 ]]; then if [ -d "$2" ]; then dir="$2" else file="${2}" mkdirs "${dir}" dir="" fi fi # construct image link: add 'echo "${google_image}"' # after this line for debug output google_image="${dir}/${file}" # construct name, append number if file exists if [[ -e "${google_image}${ext}" ]] ; then i=0 while [[ -e "${google_image}(${i})${ext}" ]] ; do ((i++)) done google_image="${google_image}(${i})${ext}" else google_image="${google_image}${ext}" fi # get actual picture and store in google_image.$ext wget --max-redirect 0 -qO "${google_image}" "${imagelink}" # if 'o' flag supplied: open image [[ $option = "o" ]] && gnome-open "${google_image}" # successful execution, exit code 0 #exit 0 } for i in `seq 1 $1`; do echo "Downloading image" $i getMyImages $i "$2"; done;
要下載前 10 個圖像,只需像以前一樣呼叫:
./getimages 10 rocky%20mountains