Shell-Script

Google圖片下載 Bash 腳本的 For 循環

  • May 31, 2015

我有一個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

引用自:https://unix.stackexchange.com/questions/206632