GREPDIFF(1)
β¨ GREPDIFF β¨
okay bestie, welcome to grepdiff from the patchutils crew β it's giving "show files modified by a diff containing a regex" and honestly? iconic. π
πΈ NAME πΈ
grepdiff β show files modified by a diff containing a regex π¦
β¨ SYNOPSIS β¨
grepdiff [[-n] | [--line-number]] [[-N] | [--number-files]] [[-p n] |
[--strip-match=n]] [--strip=n] [--git-prefixes=strip|keep]
[--git-extended-diffs=exclude|include] [--addprefix=PREFIX]
[--addoldprefix=PREFIX] [--addnewprefix=PREFIX] [[-s] |
[--status]] [--empty-files-as-absent] [[-i PATTERN] |
[--include=PATTERN]] [[-I FILE] | [--include-from-file=FILE]]
[[-x PATTERN] | [--exclude=PATTERN]] [[-X FILE] |
[--exclude-from-file=FILE]] [[-# RANGE] | [--hunks=RANGE]]
[--lines=RANGE] [[-FRANGE] | [--files=RANGE]] [--annotate]
[--as-numbered-lines=WHEN] [--format=FORMAT]
[--remove-timestamps] [[-v] | [--verbose]] [[-z] |
[--decompress]] [[-E] | [--extended-regexp]] [[-H] |
[--with-filename]] [[-h] | [--no-filename]]
[--output-matching=WHAT] [--only-match=WHAT] {[REGEX] |
[-f FILE]} [file...]
grepdiff {[--help] | [--version] | [--list] | [--filter ...]}
π DESCRIPTION π
So here's the tea β: for every file that a patch modifies, if the patch hunk contains the REGEX, then that file's name gets printed. That's the whole personality. π
The regular expression is treated as POSIX Basic Regular Expression syntax, unless you hand it the -E option, in which case POSIX Extended Regular Expression syntax gets used instead. But wait β when it's compiled with PCRE2 support, PCRE regular expressions are used instead of POSIX regular expressions, and the -E option has no effect since PCRE already supports extended regular expression features by default. okay so that's a whole thing, noted. π
You can use unified, context, and Git format diffs with this program, bestie. Git format includes support for binary files, file renames, permission mode changes, and other Git-specific diff features. slay. π
π OPTIONS π
-n,--line-numberβ Display the line number that each patch begins at. If verbose output is requested, each matching hunk is listed as well. (For a description of the output format seelsdiff(1).)-N,--number-filesβ File numbers are listed, beginning at1, before each filename.-pn,--strip-match=nβ When matching, ignore the first n components of the pathname.--strip=nβ Remove the first n components of the pathname before displaying it.--git-prefixes=strip|keepβ How to handlea/andb/prefixes in Git diff filenames. Withstrip, removes the prefixes both for filename matching (when using-iand-xoptions) and for filename output (similar to--strip). Withkeep(default), preserves existing behavior. Applies to both Git-specific diffs (binary files, renames, mode changes) and traditional diffs when part of a Git patch. Note: Withkeep, copy and rename operations are treated as if they hada/andb/prefixes for consistency with other Git operations. The default will change tostripin version0.5.0.--git-extended-diffs=exclude|includeβ Controls whether to process Git diffs without traditional content hunks. This includes renames, copies, mode-only changes, and binary files. Withexclude(default in0.4.x), these diffs are skipped. Withinclude(default in0.5.0+), these diffs are processed normally. This option affects file numbering with-Nand file filtering with-F.--addprefix=PREFIXβ Prefix the pathname with PREFIX before displaying it. This will override any individual settings specified with the--addoldprefixor--addnewprefixoptions.--addoldprefix=PREFIXβ Prefix pathnames for old or original files in the output by PREFIX.--addnewprefix=PREFIXβ Prefix pathnames for updated or new files in the output by PREFIX.-sβ Show file additions, modifications and removals. A file addition is indicated by aβ+β, a removal by aβ-β, and a modification by aβ!β. (the synopsis also lets you call this one--statusπ«Ά)--empty-files-as-absentβ Treat empty files as absent when matching patterns.-iPATTERN,--include=PATTERNβ Include only files matching PATTERN.-IFILE,--include-from-file=FILEβ Include only files matching any pattern listed in FILE, one pattern per line. All other lines in the input are suppressed.-x PATTERN,--exclude=PATTERNβ Exclude files matching PATTERN.-XFILE,--exclude-from-file=FILEβ Exclude files matching any pattern listed in FILE, one pattern per line. All other lines in the input are displayed.-#RANGE,--hunks=RANGEβ Only include hunks within the specified RANGE. Hunks are numbered from1, and the range is a comma-separated list of numbers orβfirst-lastβspans, optionally preceded by a modifier'x'which inverts the entire range; either the first or the last in the span may be omitted to indicate no limit in that direction. π--lines=RANGEβ Only list hunks that contain lines from the original file that lie within the specified RANGE. Lines are numbered from1, and the range is a comma-separated list of numbers orβfirst-lastβspans, optionally preceded by a modifier'x'which inverts the entire range; either the first or the last in the span may be omitted to indicate no limit in that direction.-F=RANGE,--files=RANGEβ Only list files indicated by the specified RANGE. Files are numbered from1in the order they appear in the patch input, and the range is a comma-separated list of numbers orβfirst-lastβspans, optionally preceded by a modifier'x'which inverts the entire range; either the first or the last in the span may be omitted to indicate no limit in that direction.--annotateβ Annotate each hunk with the filename and hunk number. βοΈ--as-numbered-lines=before|after|original-before|original-afterβ Instead of a patch fragment, display the lines of the selected hunks with the line number of the file before (or after) the patch is applied, followed by a TAB character and a colon, at the beginning of each line. Each hunk except the first will have a line consisting ofβ...βbefore it.
The before and after options show line numbers adjusted for any skipped hunks. The original-before and original-after options show line numbers as they appear in the original diff, preserving the original line number context. This is useful for CI/CD systems that need to report errors on the exact line numbers from the original diff. π§
--format=unified|contextβ Use specified output format.--remove-timestampsβ Do not include file timestamps in the output.-z,--decompressβ Decompress files with extensions.gzand.bz2.-E,--extended-regexpβ Use POSIX Extended Regular Expression syntax. Note: when compiled with PCRE2 support, this option has no effect as PCRE regular expressions are used by default and already support extended regular expression features. π-H,--with-filenameβ Print the name of the patch file containing each match.-h,--no-filenameβ Suppress the name of the patch file containing each match.-fFILE,--file=FILEβ Read regular expressions from FILE, one per line.--output-matching=hunk|fileβ Display the matching hunk-level or file-level diffs.--only-match=rem|removals|add|additions|mod|modifications|allβ Limit regex matching to removals, additions, modifications or the whole hunk.--helpβ Display a short usage message.--versionβ Display the version number ofgrepdiff.--filterβ Behave likefilterdiff(1)instead.--listβ Behave likelsdiff(1)instead.
π EXAMPLES π
Wanna quickly identify which files in a large patch contain memory allocation changes? (super useful for code review, fr fr):
grepdiff "malloc\|free\|realloc" large-patch.diff
This shows only the filenames, giving you a quick overview without being overwhelmed by diff content. π
To see the actual hunks containing the pattern:
grepdiff --output-matching=hunk "malloc" patch.diff
To see complete file diffs for files containing the pattern:
grepdiff --output-matching=file "malloc" patch.diff
For CI/CD systems that need line numbers matching the original diff context (useful for error reporting):
grepdiff pattern --output-matching=hunk \
--as-numbered-lines=original-after patch.file
Git format diffs are fully supported. For example, to find files in a git patch that contain changes to malloc calls:
grepdiff "malloc" git-patch.patch
Note that grepdiff searches in the hunk content (the actual code changes), not in Git metadata like rename headers. Files with only renames or mode changes (no content hunks) won't be found even if the pattern appears in the Git headers. β¨
π¦ SEE ALSO π¦
filterdiff(1), lsdiff(1), patchview(1)
π AUTHOR π
Tim Waugh <twaugh@redhat.com> Package maintainer
patchutils Β· 10 Feb 2011 β ok that's the whole page bestie, go forth and grep those diffs, no cap π ππ«Ά
π¦ where this page comes from
- alpine 3.24: patchutils-doc 0.4.5-r0 Β· GPL-2.0-or-later
- arch rolling: patchutils 0.4.5-1 Β· GPL-2.0-only
- ubuntu stonking: patchutils 0.4.5-1ubuntu1 Β· GPL-2.0-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms