bash:处理块中文件的列表
发布时间:2020-12-15 21:31:01 所属栏目:安全 来源:网络整理
导读:那个设定: 我有几百个文件,命名为input0.dat,input1.dat,…,input150.dat,我需要使用一些命令cmd处理它(基本上合并所有文件的内容). cmd将输出文件名作为第一个选项,然后是所有输入文件名的列表: ./cmd output.dat input1.dat input2.dat [...] input150.d
那个设定:
我有几百个文件,命名为input0.dat,input1.dat,…,input150.dat,我需要使用一些命令cmd处理它(基本上合并所有文件的内容). cmd将输出文件名作为第一个选项,然后是所有输入文件名的列表: ./cmd output.dat input1.dat input2.dat [...] input150.dat 问题: 问题是由于内存问题,脚本只能处理10个左右的文件(不要因此而责怪我).因此,而不是像使用bash通配符扩展名 ./cmd output.dat *dat 我需要做点什么 ./cmd temp_output0.dat file0.dat file1.dat [...] file9.dat [...] ./cmd temp_outputN.dat fileN0.dat fileN1.dat [...] fileN9.dat 之后我可以合并临时输出. ./cmd output.dat output0.dat [...] outputN.dat 如何在bash中有效编写脚本? 我尝试过,没有成功,例如 for filename in `echo *dat | xargs -n 3`; do [...]; done 问题是,这会再次处理所有文件,因为xargs的输出行会连接起来. 编辑:请注意,我需要在调用cmd时将输出文件名指定为第一个命令行参数! 解决方法
你可以做:
i=0 opfiles= mkfifo /tmp/foo echo *dat | xargs -n 3 >/tmp/foo& while read threefiles; do ./cmd tmp_output$i.dat $threefiles opfiles="$opfiles tmp_output$i.dat" ((i++)) done </tmp/foo rm -f /tmp/foo wait ./cmd output.dat $opfiles rm $opfiles 您需要使用fifo来保存i变量值,以及最终的连接文件集. 如果需要,可以在./cmd内部调用后台,在最后一次调用cmd之前放一个等待: i=0 opfiles= mkfifo /tmp/foo echo *dat | xargs -n 3 >/tmp/foo& while read threefiles; do ./cmd tmp_output$i.dat $threefiles& opfiles="$opfiles tmp_output$i.dat" ((i++)) done </tmp/foo rm -f /tmp/foo wait ./cmd output.dat $opfiles rm $opfiles 更新 i=0 opfiles=() while read threefiles; do ./cmd tmp_output$i.dat $threefiles opfiles+=("tmp_output$i.dat") ((i++)) done < <(echo *dat | xargs -n 3) ./cmd output.dat "${opfiles[@]}" rm "${opfiles[@]}" 再次避免管道进入while,但从重定向读取以保持opfiles在while循环后变量. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |