我正在尝试在超过100万bash
个文件的csv
脚本下运行:
#!/bin/bash
new_header="cell,id,too,issue,valid,DPT,RH,TMP,U,V"
sed -i'' "1s/.*/$new_header/" /cygdrive/d/csv/*.csv
但是在运行此代码时,我收到以下错误:
./bash.sh: line 3: 11464 Segmentation fault (core dumped) sed -i'' "1s/.*/$new_header/" /cygdrive/d/csv/*.csv
我确信有一些方法可以在100万csv
个文件上运行脚本,但我还没有找到任何内容。
答案 0 :(得分:5)
我想通过展开/cygdrive/d/csv/*.csv
生成的命令行的长度太长了。
解决此问题的一种方法是使用find
:
find /cygdrive/d/csv/ -name '*.csv' -exec sed -i '' "1s/.*/$new_header/" {} +
这将运行所需的最小数量的单独sed进程,使命令长度保持在限制范围内。
正如评论中所提到的,如果您的sed版本实际上需要在-i
之后传递一个参数(GNU sed没有),那么在''
之前需要一个空格。否则,您只需删除''
。
答案 1 :(得分:1)
在获得不应该实际发生的Segmentation Fault
方面做得很好。
我会在这里使用find
(或可能xargs
)。它可以将结果分解为多次调用,并且永远不会对1,000,000 args做任何事情
find
有一个-exec
开关,允许它使用找到的文件执行命令,而不是简单地打印。