如何从shell中将一个文件附加到Linux中的另一个文件?

时间:2011-02-11 13:39:20

标签: linux shell file ubuntu append

我有两个文件:file1file2。如何将file2的内容附加到file1,以便file1的内容可以保留此过程?

10 个答案:

答案 0 :(得分:567)

使用bash builtin redirection (tldp)

cat file2 >> file1

答案 1 :(得分:284)

cat file2 >> file1

>>运算符将输出附加到指定文件,或者如果它不存在则创建指定文件。

cat file1 file2 > file3

将两个或多个文件连接到一个文件。您可以根据需要拥有尽可能多的源文件。例如,

cat *.txt >> newfile.txt

更新20130902
在评论中,eumiro建议“不要尝试cat file1 file2 > file1。”这可能不会导致预期结果的原因是接收重定向的文件是在执行>左侧的命令之前准备的。在这种情况下,第一个file1被截断为零长度并打开输出,然后cat命令尝试将现在为零长度的文件加上file2的内容连接到{{1 }}。结果是file1的原始内容丢失,取而代之的是file1的副本,这可能不是预期的。

更新20160919
在评论中,tpartee建议链接到支持信息/来源。对于权威参考,我将善意的读者引导到linuxcommand.org上的sh man page,其中指出:

  

在执行命令之前,可以重定向其输入和输出   使用shell解释的特殊符号。

虽然这确实告诉读者他们需要知道什么,如果你不是在寻找它并逐字逐句解析,那么很容易错过。这里最重要的词是'之前'。在命令执行之前,重定向已完成(或失败)

file2的示例情况下,shell首先执行重定向,以便I / O句柄在执行命令之前执行的环境中就位。

可以在Ian Allen的网站上以Linux课件的形式找到一个更为友好的版本,其中重定向优先级可以详细介绍。他的I/O Redirection Notes页面对这个主题有很多话要说,包括即使没有命令也可以进行重定向的观察。把它传递给shell:

cat file1 file2 > file1

...创建一个名为out的空文件。 shell首先设置I / O重定向,然后查找命令,找不到,并完成操作。

答案 2 :(得分:39)

注意:如果您需要使用 sudo ,请执行以下操作:

sudo bash -c 'cat file2 >> file1'

简单地将sudo添加到命令的常用方法将失败,因为权限提升不会延续到输出重定向。

答案 3 :(得分:27)

尝试此命令:

cat file2 >> file1

答案 4 :(得分:22)

您寻求的命令是

cat file2 >> file1

答案 5 :(得分:13)

仅供参考,使用ddrescue提供了一种实现任务的可中断方式,例如,如果您有大文件,需要暂停,然后在稍后进行:

ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile

logfile是重要的一点。您可以使用Ctrl-C中断该过程并通过再次指定完全相同的命令来恢复它,ddrescue将读取logfile并从中断处继续。 -o A标志告诉ddrescue从输出文件(file1)中的字节 A 开始。因此,wc --bytes file1 | awk '{ print $1 }'只会以字节为单位提取file1的大小(如果愿意,您只需粘贴ls的输出)。

正如评论中 ngks 所指出的,缺点是默认情况下可能不会安装ddrescue,因此您必须手动安装它。另一个复杂因素是ddrescue有两个版本可能存在于您的存储库中:有关详细信息,请参阅this askubuntu question。你想要的版本是GNU ddrescue,在基于Debian的系统上是名为gddrescue的包:

sudo apt install gddrescue

对于其他发行版,请检查您的包管理系统是否有 GNU 版本的ddrescue。

答案 6 :(得分:1)

另一种解决方案:

tryOnError

cat file1 | tee -a file2 的好处是可以附加到任意数量的文件,例如:

tee

会将cat file1 | tee -a file2 file3 file3 的内容附加到file1file2file3

从手册页:

file4

答案 7 :(得分:0)

Chem_11可以是简单的解决方案,但是当我们连接大文件时变得非常慢,cat是为了拯救你,尽管你必须使用一次猫。

find -print

答案 8 :(得分:0)

您也可以在没有cat的情况下执行此操作,但老实说cat更具可读性:

>> file1 < file2

>> STDIN 追加到file1,将<转储file2追加到 STDIN

答案 9 :(得分:0)

对此我不确定,但是很多人在这里告诉我,使用cat命令显示单个文件的内容不是一个好习惯,有人与我共享this链接。 / p>

考虑所有这些,以下方法似乎更好。

echo -n "$(<file1)" >> file2