用于 Google 图片下载的 Bash 脚本的 For 循环

用于 Google 图片下载的 Bash 脚本的 For 循环

我有一个从 Google Images 下载图像的 bash 脚本

这是我使用的命令:

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

我想要将 For 循环合并到 bash 脚本中,以便它下载指定搜索词的 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

答案1

当您可以在循环中运行命令时,为什么要将其合并到脚本中:

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

相关内容