grepdiff - Man Page
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] [--addprefix=PREFIX] [--addoldprefix=PREFIX] [--addnewprefix=PREFIX] [[-s] | [--status]] [[-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
For each file modified by a patch, if the patch hunk contains the REGEX then the file's name is printed.
The regular expression is treated as POSIX Basic Regular Expression syntax, unless the -E option is given in which case POSIX Extended Regular Expression syntax is used. When 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.
For example, to see the patches in my.patch which contain the regular expression “pf_gfp_mask”, use:
grepdiff pf_gfp_mask my.patch | \ xargs -rn1 filterdiff my.patch -i
You can use unified, context, and Git format diffs with this program. Git format includes support for binary files, file renames, permission mode changes, and other Git-specific diff features.
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 see lsdiff(1).
- -N, --number-files
File numbers are listed, beginning at 1, 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 handle a/ and b/ prefixes in Git diff filenames. With strip, removes the prefixes both for filename matching (when using -i and -x options) and for filename output (similar to --strip). With keep (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: With keep, copy and rename operations are treated as if they had a/ and b/ prefixes for consistency with other Git operations. The default will change to strip in version 0.5.0.
- --addprefix=PREFIX
Prefix the pathname with PREFIX before displaying it. This will override any individual settings specified with the --addoldprefix or --addnewprefix options.
- --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 “!”.
- -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 from 1, 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 from 1, 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 from 1 in 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 .gz and .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 of grepdiff.
- --filter
Behave like filterdiff(1) instead.
- --list
Behave like lsdiff(1) instead.
Examples
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
Author
Tim Waugh <twaugh@redhat.com>
Package maintainer
Referenced By
filterdiff(1), lsdiff(1), patchview(1).