Is it possible to tell patch not to generate .orig and .rej files? I find it extremely annoying that patch creates these.

If you're not giving any option to patch other than -pN, it only creates those files when a patch fails to apply cleanly.

So, one option is to stop creating (or accepting) bad patches. :)

Back in the real world, this is a feature. When patch(1) fails to apply a patch segment to the original file, it saves the temporary original file copy out durably as *.orig, dumps the rejected segment to *.rej, and continues trying to apply patch segments. The idea is that you can open the *.rej file and complete the patch process manually by copying bits and pieces over to the patched file. The *.orig file can also be useful when the patch process accidentally wrecks something, and you need to refer to the original version to fix it.

I don't always fix a bad patch with text from the *.rej and *.orig files, but it's nice to have them in case I need them.

Once I've fixed up a bad patch, I run the following script at the project root to quickly clean things up:

#!/bin/bash
find . '(' \
    -name \*-baseline -o \
    -name \*-merge -o \
    -name \*-original -o \
    -name \*.orig -o \
    -name \*.rej \
')' -delete

I call it cleanup-after-bad-patch because the long name partially insures against running this accidentally, since it could remove files you still need. To be honest, though, I normally run it by typing cleanTabEnter, that being sufficient to find this script in the PATH on my development machines.

The additional patterns it checks for are for the files output by my version control system of choice when it encounters the same problem during a merge operation. You may wish to adjust it for your VCS/SCM tools.

To tell patch not to produce backups just omit the -b and any --backup-... options.

To instruct it not to create .rej files add -r - option to the command.

  • 3
    This doesn't work for me – it just puts the rejects in a file called "-", which is a very very annoying filename to have around. I'm using version 2.5.8 on a Mac. – rjmunro Jan 28 '15 at 11:29

The --no-backup-if-mismatch option will avoid the ".orig" files.

You might also want to try the --merge option, which creates an in-file conflict.

In all cases you should have some way to get back to a good state quickly if the merge becomes overwhelming.

I'm stuck with patch v2.5.4 where -r - causes it to create reject files named -.

I found that --reject-file= i.e. empty value causes patch to fail with exit code 2 IF it tries to write a reject file. If there are no rejects it works as expected. While not a complete solution for older version of patch, under some circumstances this may be acceptable or desired.

The best I could come up with (admittedly a way to sweep the dirt under the rug) is using -r <tmpfile>, i.e.:

# patch -r /tmp/deleteme.rej -i patchfile filetobepatched

since in v2.5.8, -r - actually creates the - file.

patch -p1 -B /dev/null -r - < file.patch

  • -1: This is very bad advice. First, the -B flag doesn't send the *.orig output to /dev/null, as it appears to from your command. It just happens that normal users can't write to files called things like /dev/nullfoo.cpp. If you do this as root, you'll get junk in your /dev tree instead. Second, -r - doesn't suppress the *.rej file. It just appears to do that because the error due to the bogus -B flag stops it from showing you what it really would do without the -B, which is create a file called - in the current directory. – Warren Young Mar 19 '15 at 8:18
  • 1
    @WarrenYoung according to man patch: "-r Put rejects into rejectfile instead of the default .rej file. When rejectfile is -, discard rejects." – Limbo Peng May 12 '15 at 9:02

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.