我有两个文件:file1和file2。如何将file2的内容追加到file1,使file1的内容持久化进程?


当前回答

Zsh特定:你也可以在没有cat的情况下做到这一点,尽管老实说cat更可读:

>> file1 < file2

>>将STDIN附加到file1, < dumps file2附加到STDIN。

其他回答

注意:如果你需要使用sudo,请这样做:

Sudo bash -c 'cat file2 >> file1'

简单地将sudo放在命令前的通常方法将失败,因为特权升级不会延续到输出重定向中。

另一个解决方案:

tee < file1 -a file2

Tee的好处是,你可以添加到尽可能多的文件,例如:

tee < file1 -a file2 file3 file3

将file1的内容追加到file2、file3和fil4。

从手册页:

-a, --append
       append to the given FILEs, do not overwrite

Zsh特定:你也可以在没有cat的情况下做到这一点,尽管老实说cat更可读:

>> file1 < file2

>>将STDIN附加到file1, < dumps file2附加到STDIN。

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

cat file2 >> file1

Cat file2 >> file1

>>操作符将输出追加到命名文件,如果命名文件不存在,则创建该文件。

Cat file1 file2 > file3

这将两个或多个文件连接到一个文件。您可以拥有任意数量的源文件。例如,

Cat *.txt >> newfile.txt

Update 20130902 In the comments eumiro suggests "don't try cat file1 file2 > file1." The reason this might not result in the expected outcome is that the file receiving the redirect is prepared before the command to the left of the > is executed. In this case, first file1 is truncated to zero length and opened for output, then the cat command attempts to concatenate the now zero-length file plus the contents of file2 into file1. The result is that the original contents of file1 are lost and in its place is a copy of file2 which probably isn't what was expected.

更新20160919 在评论中,tpartee建议链接到支持信息/来源。为了获得权威的参考,我引导善良的读者去linuxcommand.org的sh手册页,上面写着:

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

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

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

在Ian Allen的网站上可以以Linux课件的形式找到一个更友好的版本,其中详细介绍了重定向优先级。他的I/O重定向笔记页面中有很多关于这个主题的内容,包括重定向即使没有命令也能工作。把这个传递给shell:

$ >out

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