web-dev-qa-db-ja.com

コンテンツを削除せずにコマンドの出力を既存のファイルにリダイレクトする方法は?

一部のファイルのバックアップを作成し、後でデータの整合性をチェックするためのチェックサムファイルchecksums.txtを作成しています。ただし、バックアップは数百のファイルで構成されているため、各チェックサムを手動でファイルに貼り付けるのは不便です。

$ md5sum file > checksums.txt

または

$ sha512sum file > checksums.txt

ただし、これを行うreplaceschecksums.txtファイルの内容は、この例ではfileファイルのチェックサムで置き換えられます。代わりに、内容を削除せずにfilechecksums.txtへのチェックサムをappendにしたいと思います。だから私の質問は:これをどうやって行うのですか?

あともう一つだけ。私は基本的なユーザーなので、わかりやすい提案を(可能な場合のみ)試みてください。

11
Carl Rojas

ファイルに追加する場合は、>>を使用する必要があります。

だからあなたの例は

$ md5sum file >> checksums.txt

そして

$ sha512sum file >> checksums.txt
23

>>演算子の横に追加モードでファイルを開く @ Thomasの回答による の他のオプションは、>演算子を使用してファイルを開くことですが、1回だけ残して次の2つのコマンドで開きます。

exec 3> checksums.txt

ファイル記述子3のファイルを開いて(切り捨てて)から、次のようにします。

md5sum file1 >&3

そこにfile1のmd5sumを書き込みます。

md5sum file2 >&3

(同じシェルから実行した場合)、file2 md5sumを追加します。

その後、次のことができます。

exec 3>&-

そのファイル記述子を閉じます。 stdout(ファイル記述子1、>演算子のデフォルト)でも、全体コマンドグループをリダイレクトすることで同じことができます。

{ md5sum file1; md5sum file2; } > checksums.txt

または、コマンドグループの代わりにサブシェルを使用します:

(md5sum file1; md5sum file2) > checksums.txt
10