使用cat将文件与必须按顺序保存的数字名称组合在一起

时间:2016-04-18 15:42:23

标签: bash

我有一些文件(这些是每次随机生成的)在名称中有一个数字 - 在文件中,数字会重复。例如:

$(".container *").text()

我想将这些文件的内容合并到一个更大的文件file1_85.txt file1_242.txt file1_9.txt

我尝试使用的代码是:

file_all.txt

但是,for f in file1_*.txt; do (cat "${f}"; echo " ") >> file_all.txt; done 的内容如下所示:

file_all.txt

当我真的希望它看起来像这样:

file1_242.txt
file1_85.txt
file1_9.txt

如果bash按数字顺序捕获文件,会发生什么。

我试过这个:

file1_9.txt
file1_85.txt
file1_242.txt

哪个有效,但是我收到了错误消息"没有这样的文件或目录"当它通过一个没有匹配文件的数字时。而且,这非常耗时。有没有更好的方法来执行这项任务?

3 个答案:

答案 0 :(得分:4)

假设文件的名称中没有任何换行符,并且您的GNU版本为sort,则可以使用:

while read file; do 
   cat "$file"
   echo 
done < <(ls -1 file_*.txt | sort -V) > file_all.txt

如果您的sort不支持-V(例如OS X),您可以利用文件名一致性进行直接数字排序:

while read file; do 
   cat "$file"
   echo 
done < <(ls -1 file_*.txt | sort -t_ -n -k2,2) > file_all.txt

最后,如果您的文件包含换行符,您仍然可以使用sort,但是您需要将-z选项与其他使用NUL字节而不是换行符终止列表元素的工具结合使用:

find . -depth 1 -name 'file_*' -print0 | sort -zV | xargs -0 -I{} bash -c 'cat {}; echo'

sort -zV替换为sort -z -t_ -n -k2,2,以替换缺少-V选项的旧版GNU排序;但是,完全非GNU类型可能也不会有-z

答案 1 :(得分:4)

对于可能包含换行符的文件名:

$ find -name 'file1*' -print0 | sort -zV | xargs -0 cat
file1_9
file1_85
file1_242

或者,如果-V选项不可用,

$ find -name 'file1*' -print0 | sort -z -n -t '_' -k 2 | xargs -0 cat
file1_9
file1_85
file1_242

这使用null分隔的文件名; -z选项告诉sort期望(并生成)空分隔文件名,xargs -0也用于空分隔输入。

答案 2 :(得分:1)

你的蛮力&#34;如果:

,方法将起作用
$ for f in file1_{1..99999}.txt; do [ -f "${f}" ] && cat "${f}" >> file_all.txt; done

比较:[ -f "${f}" ]检查文件是否存在于cat之前,避免出现错误消息。