A Node.js implementation of cat, as specified by POSIX/SUSv3. No frills, no buffering, no charset conversion, just cat.
$ marked README.md | nodecat header.html - footer.html > README.html
- Supports copying stdin by default or explicitly using the name
-
. - Copies all files byte-for-byte without requiring a valid encoding.
- Does not buffer any input or output (beyond any buffering done by the
libuv/Node internals and the
stream.Readable.prototype.pipe
implementation). - Handles both read and write errors gracefully.
- Recognizes the
-u
option specified by POSIX (which is ignored, since nodecat is always unbuffered). - Recognizes the
--
option delimiter, allowing filenames which begin with-
after the delimiter. - Asynchronous, non-blocking API to support concurrent use cases and caller-provided streams.
This package can be installed using npm, either globally or locally, by running:
npm install nodecat
$ nodecat -- -unfortunate-name.html footer.html > combined.html
var nodecat = require('nodecat');
nodecat(
['header.html', '-', 'footer.html'],
{fileStreams: {'-': process.stdin}},
function(err) {
if (err) {
console.error('Error concatenating files: ', err);
} else {
console.error('Done concatenating files.');
}
}
);
To concatenate files into a stream.Writable
(which may be a
fs.WriteStream
, net.Socket
, tty.WriteStream
, stream.PassThrough
, or
any other stream.Writable
subtype):
var nodecat = require('nodecat');
var stream = require('stream');
var outStream = stream.PassThrough();
var errStream = stream.PassThrough();
nodecat(
['header.html', '-', 'footer.html'],
{
fileStreams: {'-': process.stdin},
outStream: outStream,
errStream: errStream
},
function(err) {
if (err) {
console.error('Error concatenating files: ', err);
} else {
console.error('Done concatenating files.');
console.error('Content:\n', String(outStream.read()));
}
}
);
Note: When nodecat
is called on large files and stdout
is redirected to a
file, it may be useful to use fs.createWriteStream('-', {fd: 1})
instead of
process.stdout
, which does synchronous
writes. Be sure
to end the stream before exiting.
More examples can be found in the test specifications.
To use this module as a library, see the API Documentation.
Contributions are appreciated. Contributors agree to abide by the Contributor Covenant Code of Conduct. If this is your first time contributing to a Free and Open Source Software project, consider reading How to Contribute to Open Source in the Open Source Guides.
If the desired change is large, complex, backwards-incompatible, can have significantly differing implementations, or may not be in scope for this project, opening an issue before writing the code can avoid frustration and save a lot of time and effort.
If nodecat does not satisfy your needs, you may want to consider these alternatives:
This project is available under the terms of the MIT License. See the summary at TLDRLegal.