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

时间:2013-05-14 13:43:08

标签: find xargs

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

find -type f -name 'tdgen_2012_??_??_????.csv' | xargs sed -i "1s/^/$HEADER\n/"

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

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

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

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

我的问题:

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

2 个答案:

答案 0 :(得分:5)

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

说明:

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

2。 { echo $HEADER; cat {}; } > tmp && mv tmp {} - 将$HEADER和找到的文件连接到tmp,并将tmp重命名为找到的文件。仅仅因为你不能做cat header {} > {}

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

答案 1 :(得分:0)

如何分而治之:

echo "$HEADER" > header
find . -type f -size 0   -name 'tdgen_2012_??_??_????.csv' -exec cp header {} \;
find . -type f -size +0c -name 'tdgen_2012_??_??_????.csv' | sed -i ...
rm header

这只会为空文件执行cp,并保持xargs / sed对非空文件的性能。如果您想将它作为单个命令,只需将其包装在脚本中即可。

在盒子外面思考:处理空文件的重点是什么?特别是当您将文件头写入没有数据的文件时?我会尝试甚至不首先创建空文件 - 或删除它们。让生活变得更加简单。请记住:只有删除的文件才是好文件: - )