将 sed 重定向到curl,然后重定向到文件

将 sed 重定向到curl,然后重定向到文件

我需要从网站下载一些页面。
我想做的是使用sed网站源代码来获取链接,将它们一一传递到curl,然后将下载的文件输出到正确目录中的正确文件中。
我会尽量说得更明确。
在页面源代码中有这样一行:

... href="view-source: http://www.site.org/the/file-42.php">
/the/file-42.php </a>"&gt; </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>"&gt; </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-42OutDir
xargs -rxargs -r curlcurl

您对如何以这种方式将“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>"&gt; </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>"&gt; </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

相关内容