如何将字符串列表传递给xargs以同时进行wget

时间:2016-05-11 22:36:46

标签: bash sed xargs

我有一个字符串数组(列表),其中包含一个附加自定义目录名称的URL

urls="http://domain.com/book1**Shakespeare http://domain.com/book2**King http://domain.com/book3**Twain"
  • 每个字符串的url部分(在**之前)请求.zip文件,我这样做 喜欢传递给wget。
  • 每个字符串的第二部分(**之后)是我希望将文件从wget请求放入
  • 的目录

所以最终,我对目录结构的期望是:

/Shakespeare/
    book.zip
/King/
    book.zip
/Twain/
    book.zip

到目前为止我得到的是......

echo $urls | xargs -n 1 -P 8 | sed 's/\*\*.*//'

这正确地输出了我需要wget的5个url,而没有**作者附加到每个url的末尾。 (即http://domain.com/book2**King变为http://domain.com/book2

现在......我想将这些新的格式正确的下载网址传递给wget,同时还以某种方式将剥离的**author部分传递给供应,作为wget 目的地选项

我使用" xargs"的主要原因是因为我已经能够将一个网址列表传递给它并同时让他们 。我希望我可以在同一个电话中同时将它们下载到不同的目的地目录。

2 个答案:

答案 0 :(得分:1)

使用shell管道,你要求的是非常尴尬的。主要问题是您尝试将一个流程(echo和/或sed)的标准输出用作另一个流程的参数({ {1}})。管道不会在这里帮助您,因为通过设计,这些流程将wget一个流程连接到另一个流程的stdin。这会将工具处理的内容与描述处理发生的 的参数混为一谈。所以管道并不是你想要的。

您可以使用stdoutsed以及awksplit等工具来破解它,但您至少想要编写一个完整的shell脚本,而不仅仅是一个管道。但我真的建议使用功能更全面的脚本语言,尤其是更好的字符串处理。您想要的另一件事是能够启动子流程。

这一切都指向像Python这样的好选择。这是一个示例实现(测试但不严格),应该做你想要的。

paste

答案 1 :(得分:1)

echo $urls | sed 's/\*\*/ -P /g' | xargs -n 3 -P 8 wget

这应该做你想要的,虽然更好的方法可能是将逻辑移到上游,即你生成$urls的任何地方。此外,我不清楚您是否需要添加.zip。如果是这样,您也可以在sed模式中执行此操作。

<强>解释

wget可以使用-P选项指定前缀/下载位置。

因此,如果您的目标是将每个命令运行为如下所示:

wget http://domain.com/book1 -P Shakespeare

然后我首先使用sed**替换为-P,然后使用xargs将其导入-n 3,因为它到达xargswget,您希望一次将三个单词传递给let filename = history.invoiceLongDate // 01223642 if !filename.isEmpty{ let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) let docs = paths[0] let pathURL = NSURL(fileURLWithPath: docs, isDirectory: true) if #available(iOS 9.0, *) { let fileURL = NSURL(fileURLWithPath: "\(filename)_my_invoice.pdf", isDirectory: false, relativeToURL: pathURL) self.docController = UIDocumentInteractionController(URL: fileURL) self.docController?.delegate = self self.docController?.presentOptionsMenuFromRect(sender.frame, inView: self.view, animated: true) } else { // Fallback on earlier versions // Any Help with that? } }