我有一个服务器上的文件列表,假设匹配模式http://example.com/abcd-{0..99}.zip
。
我想下载然后解压所有这些文件(它们只是压缩的文本,每个 .zip 中都有一个文件),将它们连接到单个流中,然后将其导入另一个程序。我知道要下载它们,最好使用 curl,要解压,我可以使用 funzip,但 funzip 只接受一个 .zip 作为参数。
bash 是否能够轻松地做到这一点(如果可以,怎么做?),或者我应该放弃并在 python 中做到这一点?
答案1
你没有说为什么要使用curl
and funzip
。我认为对于你的目的来说wget
andunzip
会更好。假设你的文件列表在文件中文件列表。然后要下载所有这些文件,请执行
wget -i filelist
然后解压缩这些文件并将它们导入到某个程序中,执行
unzip -p 'abcd-*.zip' | program
请注意,您必须用引号括住给定的 zip 文件名模式,unzip
以便它不会被您的 shell 扩展。
如果您还没有要下载的文件列表,但它们的名称遵循您给出的模式,您可以按如下方式创建列表。
seq 0 99 | while read n; do echo "http://example.com/abcd-$n.zip"; done > filelist
答案2
我最终编写的脚本是:
echo http://example.com/some-data{0..799}.csv.zip | xargs -n1 -P8 ./download-file
下载文件的内容为:
#!/bin/bash
NAME=$(basename $1 .zip).xz
wget -O- $1 | funzip | nice -n5 xz -z9 > $NAME