加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

更新
如果要完全避免使用fifo,可以使用进程替换来模拟它,因此将第一个重写为:

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循环后变量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读