当前位置: 首页>>技术教程>>正文


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

, , , ,

问题描述

我有两个文件:file1file2。如何将file2的内容附加到file1,以使file1的内容持续进行?

最佳解决办法

使用bash builtin redirection (tldp)

cat file2 >> file1

次佳解决办法

cat file2 >> file1

>>运算符将输出附加到指定文件或创建命名文件(如果它不存在)。

cat file1 file2 > file3

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

cat *.txt >> newfile.txt

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

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

Before a command is executed, its input and output may be redirected using a special notation interpreted by the shell.

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

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

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

$ >out

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

第三种解决办法

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

sudo bash -c 'cat file2 >> file1'

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

第四种办法

试试这个命令:

cat file2 >> file1

第五种办法

你寻求的命令是

cat file2 >> file1

第六种办法

仅供参考,使用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有两个版本可能存在于您的存储库中:有关详细信息,请参阅ddrescue,gddrescue和dd_rescue有什么区别?。您需要的版本是GNU ddrescue,而在Debian-based系统上是名为gddrescue的软件包:

sudo apt install gddrescue

对于其他发行版,请检查您的包管理系统以获取GNU版本的ddrescue。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6607.html,未经允许,请勿转载。