I am creating a large tar archive and I would like to create the checksum of the archive too. I could achieve it like this:

$ tar cfz archive.tar.gz files
$ sha256sum archive.tar.gz > archive.tar.gz.sha256sum

But the archive file is huge and on slow media, so I'd prefer not to have to read it all in again after writing it out.

Can I build a pipeline that will hash the file as it writes it? I thought maybe I could do this with the tee utility, but that only writes to a file, not to the standard input of another command.

1 Answer 1


Answering my own question:

Yes, you can use tee and bash process substitution:

tar cfz - files | tee >(sha256sum) | cat > archive.tar.gz
  • 1
    Minor improvements: You probably don't need the "| cat" part, you can just write it directly. You also probably want the subcommand (the "(sha256sum)" to write somewhere, i.e. (sha256sum >archive.tar.gz.sha256sum)
    – MAP
    Aug 12, 2016 at 4:51
  • 3
    Just use | tee archive.tar.gz | sha256sum then. Aug 12, 2016 at 7:24

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .