如何在Ubuntu Linux中将一个文件附加到另一个文件?

asi*_*sir 406 linux shell ubuntu file append

我有两个文件:file1file2.如何追加内容file2file1使内容file1持久化?

Dav*_*vid 592

使用bash内置重定向(tldp):

cat file2 >> file1
Run Code Online (Sandbox Code Playgroud)

  • @ user1443778:实际上,是的.至少那是我在90年代成功获得Linux的方式.我在旧Linux论坛上发现的一个获得良好反应的技巧是:如果你问,"你如何在Linux中做__?" 然后期待RTFM响应的冰雹和对你的情报的一般侮辱.(更不用说每个发行版都有一个不同的FM表示不同的东西,如果有的话.)但是,如果你说,"Linux很糟糕,因为它不能做__!Windows可以!" 然后,虽然你仍然会受到侮辱的冰雹,但你会在第一时间获得你想要的有用信息:) (151认同)
  • Thx也需要这个!只是想知道,人们是如何在互联网上学到这一点的.阅读Unix手册并留胡子? (12认同)
  • (注意:这不是在Stack Exchange上展示的行为,但它在"旧Linux论坛"上对我有用.) (8认同)
  • 你怎么做目标文件不属于你,你需要使用sudo? (3认同)
  • 它不起作用.我得到权限拒绝错误. (3认同)
  • @Sigur还是看看`tee`程序:`cat 1 | tee -a 2 3` 在`--append`(或简称为-a`)开关之后,您可以放置​​任意数量的文件. (2认同)

T.R*_*Rob 289

cat file2 >> file1

>>运营商将输出追加到指定的文件或创建命名的文件,如果它不存在.

cat file1 file2 > file3

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

cat *.txt >> newfile.txt

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

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

在执行命令之前,可以使用shell解释的特殊表示法重定向其输入和输出.

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

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

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

$ >out
Run Code Online (Sandbox Code Playgroud)

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

  • @asir - 不要尝试`cat file1 file2> file1` - 这不会像你正在等待的那样工作. (16认同)
  • 实际上这正是他所需要的.他说"不覆盖当前的文件1".前三个回答者完全忽略了这部分问题并建议使用`>>`命令****将修改文件`file1`.T.Rob在解释他的答案方面做得非常出色,而不仅仅是竞相提交一些事实上不正确的事情.基于问题的文本,我认为`cat file1 file2> file3`是@asir正在寻找的适当命令. (5认同)
  • 这应该是公认的答案,良好的细节,甚至更新与警告.只有批评与支持信息/来源无关. (2认同)

jdu*_*unk 39

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

sudo bash -c 'cat file2 >> file1'

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

  • 另一个常见的习语是`cat file2 | sudo tee -a file1>/dev/null` (4认同)

eum*_*iro 27

试试这个命令:

cat file2 >> file1
Run Code Online (Sandbox Code Playgroud)


jma*_*zek 22

你寻求的命令是

cat file2 >> file1
Run Code Online (Sandbox Code Playgroud)


Zor*_*war 13

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

ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile
Run Code Online (Sandbox Code Playgroud)

logfile是重要的一点.你可以Ctrl-C通过再次指定完全相同的命令来中断进程并恢复它,ddrescue将从logfile它停止的位置读取和恢复.该-o A标志告诉ddrescue从输出文件()中的字节A开始file1.所以wc --bytes file1 | awk '{ print $1 }'只提取file1字节大小(ls如果你愿意,可以直接粘贴输出).

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

sudo apt install gddrescue
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*ker 7

另一个解决方案:

tee < file1 -a file2
Run Code Online (Sandbox Code Playgroud)

tee优点是您可以将一个文件附加到多个文件,例如:

tee < file1 -a file2 file3 file3
Run Code Online (Sandbox Code Playgroud)

会将 的内容附加file1file2file3file4

相比之下

cat file2 file3 file4 >> file1
Run Code Online (Sandbox Code Playgroud)

它将多个文件附加到一个文件上。

从手册页:

-a, --append
       append to the given FILEs, do not overwrite
Run Code Online (Sandbox Code Playgroud)