问题描述
我有两个文件:file1
和file2
。如何将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。
参考资料