我有一个字符串数组(列表),其中包含一个附加自定义目录名称的URL
urls="http://domain.com/book1**Shakespeare http://domain.com/book2**King http://domain.com/book3**Twain"
所以最终,我对目录结构的期望是:
/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"的主要原因是因为我已经能够将一个网址列表传递给它并同时让他们 。我希望我可以在同一个电话中同时将它们下载到不同的目的地目录。
答案 0 :(得分:1)
使用shell管道,你要求的是非常尴尬的。主要问题是您尝试将一个流程(echo
和/或sed
)的标准输出用作另一个流程的参数({ {1}})。管道不会在这里帮助您,因为通过设计,这些流程将wget
一个流程连接到另一个流程的stdin
。这会将工具处理的内容与描述处理发生的 的参数混为一谈。所以管道并不是你想要的。
您可以使用stdout
或sed
以及awk
,split
等工具来破解它,但您至少想要编写一个完整的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
,因为它到达xargs
时wget
,您希望一次将三个单词传递给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?
}
}
。