如何将标头添加到大量文件(空/非空)

Jiř*_*car 3 find xargs

我需要将标题(单行)添加到大量(> 10k)的文本文件中.假设变量$ HEADER确实包含适当的头.命令

find -type f -name 'tdgen_2012_??_??_????.csv' | xargs sed -i "1s/^/$HEADER\n/"
Run Code Online (Sandbox Code Playgroud)

确实运作良好.我面临的问题是一些数据文件(tdgen_2012_ ?? ?? ????.csv)是空的.sed(1)不能解决文件的非存在行.我决定以不同的方式管理空文件:

echo $HEADER | tee $(find -type f -name 'tdgen_2012_??_??_????.csv' -empty) > /dev/null
Run Code Online (Sandbox Code Playgroud)

由于空文件的数量,上面的命令不起作用.tee(1)无法写入无限数量的文件.还可以超过命令行参数的数量.

由于性能低,我不想使用for-cycle(tee(1)可以一次写入多个文件).

我的问题:

  1. 是否同时存在两种数据文件(空/非空)的解决方案?
  2. 如果没有:如何有效地管理空文件?

rzy*_*mek 5

echo $HEADER > header
find -type f -name 'tdgen_2012_??_??_????.csv' \
    -exec sh -c '{ echo $HEADER; cat {}; } > tmp && mv tmp {}' \; -print
Run Code Online (Sandbox Code Playgroud)

说明:

1. -exec sh -c "..." - 能够调用多个命令

2. { echo $HEADER; cat {}; } > tmp && mv tmp {} - 连接$HEADER并找到找到的文件tmp并重命名tmp为找到的文件.只是因为你做不到cat header {} > {}

3. -print - 显示每个更改文件的文件名

  • +1你也可以使用`{echo'$ HEADER'来避免使用`header`临时文件; 猫 {}; }> tmp`而不是. (2认同)