我有两个文件:file1和file2。如何将file2的内容追加到file1,以便file1的内容持久化该进程?
file1
file2
使用Bash内置重定向(tldp):
cat file2 >> file1
试试这个命令:
>>操作符将输出追加到命名文件,如果命名文件不存在,则创建该命名文件。
>>
cat file1 file2 > file3
这将两个或多个文件连接到一个文件。您可以拥有任意数量的源文件。例如,
cat *.txt >> newfile.txt
cat file1 file2 > file1
>
cat
命令执行前,可能存在输入输出重定向的情况 .使用shell解释的特殊符号
命令执行前,可能存在输入输出重定向的情况
虽然这确实告诉读者他们需要知道什么,但如果你没有逐字逐句地寻找和分析语句,就很容易错过。这里最重要的单词是before。重定向完成(或失败)之前命令被执行。
在cat file1 file2 > file1的例子中,shell首先执行重定向,以便I/O句柄在执行命令之前在执行命令的环境中就位。
在Ian Allen的网站上可以以Linux课件的形式找到一个更友好的版本,其中详细介绍了重定向优先级。他的I/O重定向说明页面有很多关于这个主题的内容,包括观察到重定向即使没有命令也能工作。把这个传递给shell:
$ >out
...创建一个名为out的空文件。shell首先设置I/O重定向,然后查找命令,没有找到命令,然后完成操作。
仅供参考,使用ddrescue提供了一种可中断的方式来完成任务,例如,如果你有大文件,需要暂停,然后在稍后的某个点继续执行:
ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile
logfile是重要的位。你可以用Ctrl-C中断进程,并通过再次指定完全相同的命令来恢复它,ddrescue将读取logfile并从它停止的地方继续。-o A标志告诉ddrescue从输出文件(file1)中的一个字节开始。所以wc --bytes file1 | awk '{ print $1 }'只是以字节为单位提取file1的大小(如果你愿意,你可以直接粘贴ls的输出)。
logfile
Ctrl-C
-o A
wc --bytes file1 | awk '{ print $1 }'
ls
正如ngk在评论中指出的,缺点是ddrescue在默认情况下可能不会被安装,所以你必须手动安装它。另一个复杂的问题是,你的存储库中可能有两个版本的ddrescue:更多信息请参阅这个问题。你需要的版本是GNU的ddrescue,在基于debian的系统上是名为gddrescue的包:
gddrescue
sudo apt install gddrescue
对于其他发行版,请检查包管理系统中ddrescue的GNU版本。
请注意:如果你需要使用sudo,这样做:
sudo bash -c 'cat file2 >> file1'
简单地将sudo前置到命令前的通常方法将失败,因为特权升级不会延续到输出重定向中。
sudo
cat可以是简单的解决方案,但当我们连接大文件时变得非常缓慢,find -print是为了拯救你,尽管你必须使用cat一次。
find -print
amey@xps ~/work/python/tmp $ ls -lhtr total 969M -rw-r--r-- 1 amey amey 485M May 24 23:54 bigFile2.txt -rw-r--r-- 1 amey amey 485M May 24 23:55 bigFile1.txt amey@xps ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt real 0m3.084s user 0m0.012s sys 0m2.308s amey@xps ~/work/python/tmp $ time find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1 real 0m2.516s user 0m0.028s sys 0m2.204s
另一个解决方案:
tee < file1 -a file2
tee的好处是你可以添加到任意多的文件,例如:
tee
tee < file1 -a file2 file3 file3
将file1的内容附加到file2, file3和file4。
file3
file4
从手册页:
-a, --append append to the given FILEs, do not overwrite
特定于Zsh:你也可以在没有cat的情况下这样做,尽管说实话cat更具可读性:
>> file1 < file2
>>将STDIN追加到file1,而<将file2转储到STDIN。
<