3

我需要将标题(单行)添加到大量(> 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 循环(tee(1) 可以一次写入多个文件)。

我的问题:

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

2 回答 2

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 - 显示每个更改文件的文件名

于 2013-05-14T13:53:40.023 回答
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 的性能。如果您希望它作为单个命令,只需将其包装在脚本中即可。

跳出框框思考:处理空文件有什么意义?特别是当您将标头写入没有数据的文件时?我要么一开始就尝试不创建空文件,要么删除它们。让生活变得如此简单。请记住:只有删除的文件才是好文件 :-)

于 2013-05-14T14:08:25.947 回答