【问题标题】:How to add header to huge amount of files (empty/non-empty)如何将标题添加到大量文件(空/非空)
【发布时间】:2013-05-08 20:01:05
【问题描述】:

我需要将标题(单行)添加到大量 (>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. 如果不是:如何有效管理空文件?

【问题讨论】:

    标签: find xargs


    【解决方案1】:
    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 您还可以通过使用{ echo '$HEADER'; cat {}; } > tmp 来避免使用header 临时文件。
    • 呃。这分叉了三倍的文件数量(sh、cat、mv)!
    • @Jens 为什么这很重要?这些命令并不是并行产生的。 Surly 这比搜索文件两次要快。
    • @rzymek 因为问题表明性能是一个问题:“由于性能低下,我不想使用 for 循环(tee(1) 可以一次写入多个文件)。” find -exec 实际上是一个循环,为每次迭代运行命令。
    【解决方案2】:

    分而治之呢:

    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 的性能。如果您想将其作为单个命令,只需将其包装在脚本中即可。

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

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      相关资源
      最近更新 更多