我正在 bash 中启动 mrjob,需要传入一系列 gz 文件作为参数,其中包含 unix 时间戳:filename_9127381923.gz
。如何以最简单的方式做到这一点?幸运的是,我可以传入多个文件参数。
范围:
1413324000(周三 0:00)
1413410400(周四0:00)
伪示例:
$python my_mrjob.py 1413324000-1413410400.gz
答案1
使用范围运算符:
echo {1413324000..1413324199}.gz
相似地,
$python my_mrjob.py {1413324000..1413324199}.gz
如果文件不是每毫秒都存在:
$python my_mrjob.py $(ls {1413324000..1413324199}.gz 2>/dev/null)
答案2
没那么简单,但我的“选择武器”
python my_mrjob.py $(
for f in {1413324000..1413410400}; do [ -f filename_$f.gz ] && echo $f; done
)
PS:恕我直言,应该修改Python作业本身以允许范围输入,并具有额外的智能来跳过不存在的文件。会更快更简单。 {a..b} 语法不是惰性迭代器;它实际上生成所有数字,并将它们传递给“for”语句。这可能会导致环境空间不足。
答案3
制作一些假的测试文件:(仅针对此示例)
$ touch filename_{1000000000..1000000099..5}.gz
从输出中获取文件的“时间”范围ls
并将其传递给echo
:
$ echo $(ls | awk -F'[_,]' '1000000044<=$2 && $2<=1000000066')
文件名_1000000045.gz 文件名_1000000050.gz 文件名_1000000055.gz 文件名_1000000060.gz 文件名_1000000065.gz
根据需要替换echo
为您的电话。$python