200

我想将五个文件的内容原样复制到一个文件中。我尝试对每个文件使用 cp 。但这会覆盖从前一个文件复制的内容。我也试过

paste -d "\n" 1.txt 0.txt

它没有用。

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

例如。文件 1.txt、2.txt、3.txt。将1,2,3的内容放入0.txt

我该怎么做 ?

4

12 回答 12

356

您需要cat(连接的缩写)命令,将 shell 重定向 ( >) 放入输出文件

cat 1.txt 2.txt 3.txt > 0.txt
于 2013-08-01T23:56:58.783 回答
109

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

find . -type f -name '*.txt' -exec cat {} + >> output.file

就我而言,我需要一个更强大的选项来查看多个子目录,因此我选择使用find. 分解它:

find .

查看当前工作目录。

-type f

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

-name '*.txt'

按名称减少结果集

-exec cat {} +

对每个结果执行 cat 命令。“+”表示仅生成 1 个实例cat(thx @gniourf_gniourf)

 >> output.file

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

于 2014-11-04T16:18:38.043 回答
47

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

cat /path/to/files/*.txt >> finalout.txt
于 2015-08-07T03:56:57.443 回答
18

如果你所有的文件都在一个目录中,你可以简单地做

cat * > 0.txt

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

于 2016-04-18T06:20:09.507 回答
17

如果您的所有文件都以类似方式命名,您可以简单地执行以下操作:

cat *.log >> output.log
于 2017-09-29T13:37:33.523 回答
15
for i in {1..3}; do cat "$i.txt" >> 0.txt; done

我找到这个页面是因为我需要将 952 个文件合并为一个。如果你有很多文件,我发现这会更好。这将为您需要的许多数字执行一个循环,并使用 >> 将每个数字附加到 0.txt 的末尾。

编辑:

正如评论中提到的:

cat {1..3}.txt >> 0.txt

或者

cat {0..3}.txt >> all.txt
于 2016-05-20T04:35:43.173 回答
5

另一种选择是sed

sed r 1.txt 2.txt 3.txt > merge.txt 

或者...

sed h 1.txt 2.txt 3.txt > merge.txt 

或者...

sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here

或者没有重定向...

sed wmerge.txt 1.txt 2.txt 3.txt

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

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

sed -n w"merge.txt" {1..3}.txt
于 2016-12-12T05:56:18.137 回答
5

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

for f in `ls *.txt`; do sed '2,$!d' $f >> 0.out; done
于 2017-05-31T17:59:29.280 回答
3

如果原始文件包含不可打印的字符,在使用 cat 命令时它们会丢失。使用“cat -v”,不可打印字符将被转换为可见字符串,但输出文件仍将不包含原始文件中的实际不可打印字符。对于少量文件,另一种方法可能是在处理非打印字符的编辑器(例如 vim)中打开第一个文件。然后移动到文件底部并输入“:r second_file_name”。这将拉入第二个文件,包括非打印字符。其他文件也可以这样做。读入所有文件后,输入“:w”。最终结果是第一个文件现在将包含它最初所做的,以及读入的文件的内容。

于 2016-09-22T19:55:37.213 回答
3

所有(文本)文件合二为一

find . | xargs cat > outfile

xargs 生成 find 的输出行。猫的论点。

find 有很多选项,例如 -name '*.txt' 或 -type。

如果你想在你的管道中使用它,你应该检查它们

于 2020-11-12T14:07:59.100 回答
2

如果要将 3 个文件的内容追加到一个文件中,那么以下命令将是一个不错的选择:

cat file1 file2 file3 | tee -a file4 > /dev/null

它将所有文件的内容合并到 file4 中,将控制台输出扔到/dev/null.

于 2016-04-22T12:46:54.947 回答
1

将多个文件发送到一个文件(textall.txt):

cat *.txt > textall.txt
于 2021-11-29T20:35:23.917 回答