2013-05-14 41 views
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 

由於空文件上面的命令不起作用量。發球區(1)不能寫入無限數量的文件。也可以超過 命令行參數的編號。

由於低性能,我不想使用for-cycle(tee(1)可以一次寫入多個文件)。

我的問題:

  1. 確實存在兩種類型的數據文件(空/非空)一次一個解決方案嗎?
  2. 如果不是:如何有效地管理空文件?

回答

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

說明:

-exec sh -c "..." - 要能夠調用一個以上的命令

2.{ echo $HEADER; cat {}; } > tmp && mv tmp {} - 串聯$HEADER和找到的文件,以tmp並重新命名tmp添加到找到的文件。僅僅因爲你不能做cat header {} > {}

-print - 顯示每個被改動過的文件

+2

+1您還可以通過使用'echo'$ HEADER'來避免使用'header'臨時文件。貓 {};而不是> tmp'。 – chepner 2013-05-14 13:54:48

+0

好點 - 更新。你學習每一天:) – rzymek 2013-05-14 14:16:34

+1

呃。這分叉了三倍的文件數量(sh,cat,mv)! – Jens 2013-05-14 21:17:39

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的性能。如果您希望將其作爲單個命令,只需將其包裝在腳本中即可。

並在盒子外思考:處理空文件有什麼意義?特別是當你寫一個頭文件到一個沒有數據的文件時?我會試圖甚至不在第一個地方創建空文件 - 或者刪除它們。讓生活變得如此簡單。請記住:只有被刪除的文件是一個好文件:-)