如何将多个文件的内容附加到一个文件中

Ste*_*eam 153 unix linux bash

我想将五个文件的内容原样复制到一个文件中.我尝试使用cp为每个文件.但是它会覆盖从前一个文件复制的内容.我也试过了

paste -d "\n" 1.txt 0.txt
Run Code Online (Sandbox Code Playgroud)

它不起作用.

我希望我的脚本在每个文本文件的末尾添加换行符.

例如.文件1.txt,2.txt,3.txt.将1,2,3的内容放在0.txt中

我该怎么做 ?

rad*_*al7 282

你需要cat(连接的简称)命令,shell重定向(>)到输出文件中

cat 1.txt 2.txt 3.txt > 0.txt
Run Code Online (Sandbox Code Playgroud)

  • @blasto取决于.您可以使用`>>`将_append_一个文件放到另一个文件上,其中`>`_overwrites_输出文件,其中包含任何内容.至于换行符,是否有换行符作为文件`1.txt`中的第一个字符?您可以使用`od -c`找出,并查看第一个字符是否是`\n`. (13认同)
  • 应该>>对吗?还有为什么在我的0.txt文件中的所有文本之前都有换行符? (8认同)
  • 你想保留 0.txt 的内容吗? (2认同)
  • @blasto 你肯定在朝着正确的方向前进。Bash 当然接受形式`{...}` 进行文件名匹配,所以也许引号在你的脚本中有点混乱?我总是尝试在 shell 中使用 `ls` 来处理这样的事情。当我得到正确的命令时,我只是将其按原样剪切-粘贴到脚本中。您可能还会发现`-x` 选项在您的脚本中很有用 - 它会在执行前回显脚本中的扩展命令。 (2认同)
  • 为了阻止某人犯同样的错误:`cat 1.txt 2.txt > 1.txt`只会用`2.txt`的内容覆盖`1.txt`。它*不会*将两个文件合并到第一个文件中。 (2认同)

mop*_*922 91

对于那些仍然像我一样偶然发现这篇文章的人来说,另一种选择是使用find -exec:

find . -type f -name '*.txt' -exec cat {} + >> output.file
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我需要一个更健壮的选项,可以查看多个子目录,所以我选择使用find.打破它:

find .
Run Code Online (Sandbox Code Playgroud)

查看当前工作目录.

-type f
Run Code Online (Sandbox Code Playgroud)

只对文件感兴趣,而不是目录等.

-name '*.txt'
Run Code Online (Sandbox Code Playgroud)

按名称减少结果集

-exec cat {} +
Run Code Online (Sandbox Code Playgroud)

对每个结果执行cat命令."+"表示只cat生成了一个实例(thx @gniourf_gniourf)

 >> output.file
Run Code Online (Sandbox Code Playgroud)

如其他答案中所述,将cat-ed内容附加到输出文件的末尾.

  • 这个答案有很多缺陷.首先,必须引用通配符`*.txt`(否则,写入的整个`find`命令是无用的).另一个缺陷来自一个严重的误解:执行的命令_is not_`cat >> 0.txt {}`,但是`cat {}`.你的命令实际上等同于`{find.-type f -name*.txt -exec cat'{}'\; ; } >> 0.txt`(我添加了分组,以便您了解真正发生的事情).另一个缺陷是`find`将找到文件`0.txt`,而`cat`会抱怨_input文件是输出文件_. (10认同)
  • 好的答案和警告的话 - 我修改了我的:`找到.-type f -exec cat {} + >> outputfile.txt`并且无法弄清楚为什么我的输出文件不会停止增长到演出,即使目录只有50兆.这是因为我一直在将outputfile.txt附加到自己身上!因此,请确保正确命名该文件或将其完全放在另一个目录中以避免这种情况. (3认同)

Esw*_*nti 40

如果你有某种输出类型,那么做这样的事情

cat /path/to/files/*.txt >> finalout.txt
Run Code Online (Sandbox Code Playgroud)

  • 请记住,您将失去维持合并顺序的可能性。如果您将文件命名为,例如,这可能会影响您。`file_1`、`file_2`、…`file_11`,因为文件的排序方式是自然顺序的。 (5认同)

Poo*_*oja 16

如果您的所有文件都在单个目录中,则可以执行此操作

cat * > 0.txt

文件1.txt,2.txt,..将进入0.txt


小智 9

for i in {1..3}; do cat "$i.txt" >> 0.txt; done
Run Code Online (Sandbox Code Playgroud)

我找到了这个页面,因为我需要将952个文件合并为一个.如果你有很多文件,我发现这可以更好地工作.这将为你需要的许多数字做一个循环,并使用>>将每个数字添加到0.txt的末尾.


小智 7

如果您的所有文件都以类似名称命名,那么您可以执

cat *.log >> output.log
Run Code Online (Sandbox Code Playgroud)


Fra*_*ran 5

另一种选择是sed

sed r 1.txt 2.txt 3.txt > merge.txt 
Run Code Online (Sandbox Code Playgroud)

或者...

sed h 1.txt 2.txt 3.txt > merge.txt 
Run Code Online (Sandbox Code Playgroud)

或者...

sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here
Run Code Online (Sandbox Code Playgroud)

或者没有重定向...

sed wmerge.txt 1.txt 2.txt 3.txt
Run Code Online (Sandbox Code Playgroud)

请注意,最后一行也写merge.txt(不是wmerge.txt!)。您可以使用w"merge.txt"避免与文件名混淆,并-n用于静默输出。

当然,您也可以使用通配符来缩短文件列表。例如,对于上面示例中的编号文件,您可以通过这种方式使用大括号指定范围:

sed -n w"merge.txt" {1..3}.txt
Run Code Online (Sandbox Code Playgroud)


bru*_*crt 5

如果您的文件包含标题并且您想在输出文件中删除它们,您可以使用:

for f in `ls *.txt`; do sed '2,$!d' $f >> 0.out; done
Run Code Online (Sandbox Code Playgroud)