저는 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 wget
xargs
wget
wget -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