我需要从网站下载一些页面。
我想做的是使用sed
网站源代码来获取链接,将它们一一传递到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
我需要做的是将内容重定向到名为 So 的目录中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
您不能完整地创建命令 ( 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