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 -하면 여러 명령을 (순차적으로) 실행할 수 있는 반면(검색할 URL이 많은 경우) 명령은 하나만 실행됩니다(따라서 원격 서버가 이를 지원하는 경우 동일한 TCP 연결을 사용함). ).xargs wgetxargswgetwget -i -

(더 나은) 작업을 수행하기 때문에 함수를 직접 작성하는 것은 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

관련 정보