将使用 wget 下载的文件传送到函数中

将使用 wget 下载的文件传送到函数中

我正在使用 wget 下载一堆图像,如果文件为空,我想使用可以将文件传递给的函数来 rm 文件。我的问题是如何将图像传输到这样的函数:

rmEmpty ()
{
    if ! [ -s "$1" ]
    then
        rm "$1";
    fi
}

我下载图像的方式是

wget -q -O- http://www.mtgsalvation.com/forums/creativity/artwork/340782-official-digital-rendering-thread?page=$i | 
sed -n '{/forum-post-body-content/,/p-comment-notes/p}' |
grep -Po 'src="\K[^"]+' | xargs wget -q -T 6 -t 1

所以如果可能的话,我希望xargs wget | rmEmpty()最后能有类似的东西。

答案1

使用适当的 HTML 解析器

#!/usr/bin/env perl
use strict; use warnings;
use WWW::Mechanize;
use HTML::TreeBuilder::XPath;

my $m = WWW::Mechanize->new( autocheck => 1 );
$m->get("http://www.mtgsalvation.com/forums/creativity/artwork/340782-official-digital-rendering-thread?page=1");
my $tree = HTML::TreeBuilder::XPath->new_from_content( $m->content );
my @imgs = $tree->findvalues( '//div[@class="j-comment-body-container p-comment-body forum-post-body-content"]//img/@src' );
`wget -i - -q -T 6 -t 1 @imgs; find . -maxdepth 1 -empty -type f -delete`;

答案2

首先,更喜欢使用wget -i -over xargs wget,因为这种xargs方式可能会(顺序)运行多个wget命令(如果您有很多要检索的 URL),而wget -i -只会运行一个命令(因此,如果远程服务器支持它,请使用相同的 TCP 连接) 。

编写自己的rmEmpty函数是没有用的,因为find . -empty -type f -delete它可以完成工作(更好)。

总结:

BASE_URL="http://www.mtgsalvation.com/forums/creativity/artwork/340782-official-digital-rendering-thread?page=$i"
wget -q -O- "$BASE_URL" | \
    sed -n '{/forum-post-body-content/,/p-comment-notes/p}' | \
    grep -Po 'src="\K[^"]+' | wget -i - -q -T 6 -t 1

find . -maxdepth 1 -empty -type f -delete

我添加了-maxdepth 1以避免在包含很多子目录($HOME例如您的目录)的目录中运行此脚本时出现问题。您应该从专用目录运行此脚本(运行脚本之前为空)。

答案3

尝试这个 :

rmEmpty ()
{
    if ! [ -s "$1" ]
    then
        rm "$1"
    fi
}

甚至更短:

rmEmpty() { [ -s "$1" ] || rm -f "$1"; }

然后 :

for $file in *; do
    rmEmpty "$file"
done

相关内容