将目录(包括子目录)中的多个文本文件连接到Bash中的单个文件中?

时间:2017-10-09 10:33:42

标签: bash shell file concatenation

我有一个每小时运行一次的脚本,我按如下方式存储故障数据:

2017/10/09/00/RetryFailure.txt
2017/10/09/01/RetryFailure.txt
2017/10/09/02/RetryFailure.txt ...

其中10是月份,09是白天,00,01,02是小时。现在在一天结束时,我想将所有(24)RetryFailure.txt连接到一个文件中,说RetryFailure10.txt。

谁能告诉我这样做的命令?

3 个答案:

答案 0 :(得分:2)

您可以使用此find汇总同一日期的所有文件:

find . -name 'RetryFailure.txt' -exec bash -c \
'IFS=/ read -ra arr <<< "$1"; cat "$1" >> "RetryFailure${arr[2]}.txt"' - {} \;

为了获得更好的性能,请使用带有进程替换的循环:

while IFS= read -rd '' file; do
   IFS=/ read -ra arr <<< "$file"
   cat "$file" >> "RetryFailure${arr[2]}.txt"
done < <(find . -name 'RetryFailure.txt' -print0) 
  • 使用find我们找到每个RetryFailure.txt文件
  • 使用read -raIFS=/我们将每个条目拆分为/并填充shell数组
  • 数组的第二个元素是数据编号
  • 使用cat ...命令,我们使用${arr[2]}
  • 将每个文件重定向到一个新文件

答案 1 :(得分:1)

cat 2017/10/*/RetryFailure.txt > concat_file

或更具限制性的

cat 2017/10/{00..23}/RetryFailure.txt > concat_file

答案 2 :(得分:1)

简短 find + cat 方法:

find . -type f -name RetryFailure.txt -exec cat {} + > RetryFailure_merged.txt