ウェブサイトから一部のページをダウンロードする必要があります。
私がやりたいことは、sed
Webサイトのソースコードを使用してリンクを取得して1つずつ渡し、ダウンロードしたファイルをcurl
正しいディレクトリの正しいファイルに出力することです。
もっと明確に説明しようとします。
ページソースコードには次の行があります。
... href="view-source: http://www.site.org/the/file-42.php">
/the/file-42.php </a>"> </span><span> OutDir and some more things ...
必要なもの(リンク - ファイル名 - ディレクトリ名)を次のように取得しました。
for i in `cat ~/site_source_file.htm `; do
echo $i | grep http://www.site.org |
sed -n 's|^.*\(http://\(www.site.org/the/file-[0-9]*\)\.php\).*.php </a>"> </span><span> \(.*\)|\1 > \3/\2|p' |
xargs -r
done;
出力は次のとおりです。
http://www.site.org/the/file-42.php > OutDir/the/file-42
私がしなければならないのは、http://www.site.org/the/file-42.php
というディレクトリにあるファイルに内容をリダイレクトすることです。そのため、単独で使用するのではなく、出力をファイルにリダイレクトする方法を使用する方が良いようです。しかし、これはうまくいきません。/the/file-42
OutDir
xargs -r
xargs -r curl
curl
このように "curl"出力をファイルにリダイレクトする方法に関する提案はありますか?
答え1
sed<->xargs<->curl 使用戦略が機能しない理由については、 で>
説明します。shell
xargs
ここでできることはいくつかあります。1) curl -o
実行できる操作は次のとおりです。
for i in `cat ~/site_source_file.htm `; do
echo $i | grep http://www.site.org |
sed -n 's|^.*\(http://\(www.site.org/the/file-[0-9]*\)\.php\).*.php </a>"> </span><span> \(.*\)|curl \1 -o \3/\2|p' |
bash
done
使用したい場合は、xargs
次のことができます。
for i in `cat ~/site_source_file.htm `; do
echo $i | grep http://www.site.org |
sed -n 's|^.*\(http://\(www.site.org/the/file-[0-9]*\)\.php\).*.php </a>"> </span><span> \(.*\)|\1 \3/\2|p' |
xargs -r -n 2 sh -c 'shift $1; curl $1 > $2' 2 1
完璧。
答え2
command()全体を生成しcurl url -o file
、それを入力に再パイプすることはできませんかbash
?
echo 'curl http://www.di.uminho.pt -o foo' | bash
視覚的な距離を超えて
答え3
GNU Parallelを使用すると、次のことができます。
lynx -dump ~/site_source_file.htm |
perl -ne '/^References/ .. 0 and /^\s+\d+..(view-source: )?(.*)/s and print $2;' |
parallel -j50 wget