丢弃低于最小文件大小的卷曲下载

时间:2017-07-04 11:47:36

标签: bash shell curl

我经常需要通过curl迭代一些图片下载,并且想要丢弃那些低于特定文件大小的下载,因为它们显然不存在,i。即返回的“图像”是404页面。 curl有一个--max-filesize选项,但不是最小文件大小的选项。

我在考虑将URL图像位置和最小文件大小传递给脚本curlmin的内容,例如

  

curlmin url minfilesize

我相信,因为我使用[]来迭代几天使用字母数字序列序列,所以我需要能够“动态”删除某些文件大小以下的文件。我在下面的尝试是完整的,因为我坚持如何引用'if'语句中的“当前”文件以及如何实际删除文件。但也许我的一个班轮也不会在第一时间起作用。

#!/bin/bash
curl -O $1 | if [ $(wc -c <"$1") -le $2 ]; then delete_file_here; fi
                            ^^                  ^^^^^^^^^^^^^^^^

有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:2)

如果您只是希望curl避免在远程文件不存在时创建本地文件,或者在请求/下载时出错,请使用-f标记:

curl -fO "$1"

但是,如果要删除特定大小以下的文件,可以选择以下几种方法:

您可以使用parameter expansion获取文件名,以删除最后/之类的所有内容,例如${1##*/}

所以你可以做到

curl -O "$1"
if [[ $(wc -c < "${1##*/}") -le $2 ]]; then
    rm -f "${1##*/}"
fi

或者我们可以使用find检查:

curl -O "$1"
find . -type f -name "${1##*/}" -size -"$2"c -delete

假设您的find支持-delete。否则,您可以将其替换为-exec rm -f {} +

如果您的curl命令可能会下载多个文件,您可以轻松调整find命令,以查找目标结构中小于给定大小的所有文件。

最安全的方法是使用find,因为它不会被奇怪的文件名绊倒。如果做不到这一点,您可以尝试使用能够更好地支持这些操作的其他语言。如果您确信只有安全名称,可以尝试以下方法:

curl -O "$1" 2>&1 | awk -v min_size="$2" '/-->/ {"stat -c%s " $NF | getline s; if(s < min_size) {system("rm " $NF);}}'

$2作为变量awk传递给min_size。然后,我们将查看包含curl的{​​{1}}输出的每一行。这些行的最后一个字段(再次假设安全名称)是本地文件名,因此我们将在其上调用-->以获取大小(stat),然后检查该大小是否低于我们{ {1}}。如果是,请在其上调用-c %s,再次相信我们有安全名称,而不是包含min_size或全球字符等的名称。

答案 1 :(得分:0)

使用wget和大括号扩展 [ Check here ] 来解决问题

wget http://www.bom.gov.au/gms/IDE00135.201707{031630..031637}.jpg