如何将命令的输出重定向到已存在的文件而不删除其内容?

Car*_*jas 11 command-line shell io-redirection text-processing files

我正在备份一些文件并创建一个校验和文件checksums.txt,以便稍后检查我的数据的完整性。然而,将每个校验和手动粘贴到文件中很不方便,因为我的备份包含数百个文件,所以四处询问我得到了通过将输出重定向到校验和文件来简化过程的建议:

$ md5sum file > checksums.txt
Run Code Online (Sandbox Code Playgroud)

或者

$ sha512sum file > checksums.txt
Run Code Online (Sandbox Code Playgroud)

然而,这样做会checksums.txt文件的校验和替换文件的内容,在这个例子中,file文件的校验和;相反,我想在不删除其内容的情况下附加to的校验和。所以我的问题是:我该怎么做?filechecksums.txt

还有一件事。由于我是一个基本用户,请尝试(仅在可能的情况下)提出易于遵循的建议。

Tho*_*ner 23

如果要附加到文件,则必须使用>>.

所以你的例子是

$ md5sum file >> checksums.txt
Run Code Online (Sandbox Code Playgroud)

$ sha512sum file >> checksums.txt
Run Code Online (Sandbox Code Playgroud)

  • 当答案比问题更简单时,这不是很好吗?:) (6认同)

Sté*_*las 11

除了@Thomas 回答的>>以追加模式打开文件的操作符之外,另一种选择是使用>操作符打开文件,但只打开一次,并为两个命令保持打开状态:

exec 3> checksums.txt
Run Code Online (Sandbox Code Playgroud)

将打开(并截断)文件描述符 3 上的文件,然后:

md5sum file1 >&3
Run Code Online (Sandbox Code Playgroud)

将在那里写入 file1 的 md5sum。

md5sum file2 >&3
Run Code Online (Sandbox Code Playgroud)

(当从同一个 shell 运行时),会附加 file2 md5sum。

然后,你可以这样做:

exec 3>&-
Run Code Online (Sandbox Code Playgroud)

关闭该文件描述符。您还可以>通过重定向整个命令组对 stdout(文件描述符 1,操作员的默认值)执行相同 操作:

{ md5sum file1; md5sum file2; } > checksums.txt
Run Code Online (Sandbox Code Playgroud)

或者使用子shell而不是命令组

(md5sum file1; md5sum file2) > checksums.txt
Run Code Online (Sandbox Code Playgroud)