diff options
author | Tomi Leppanen <tomi.leppanen@jolla.com> | 2019-11-25 17:59:52 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2019-11-27 17:11:09 +0100 |
commit | 1b76ffaae400f266fe5aea0d5900a7e2ab9d7aa8 (patch) | |
tree | 3d1cd284687332353a67e839ebbcb2741bb14f99 | |
parent | 008413754ba588e6168c3d15280181fb2c331770 (diff) | |
download | busybox-w32-1b76ffaae400f266fe5aea0d5900a7e2ab9d7aa8.tar.gz busybox-w32-1b76ffaae400f266fe5aea0d5900a7e2ab9d7aa8.tar.bz2 busybox-w32-1b76ffaae400f266fe5aea0d5900a7e2ab9d7aa8.zip |
grep: add -R
This adds -R option to grep similar to GNU grep. It is the same as -r
but also dereferences symbolic links to directories.
function old new delta
grep_main 834 850 +16
packed_usage 33362 33368 +6
grep_file 1440 1441 +1
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 23/0) Total: 23 bytes
Signed-off-by: Tomi Leppanen <tomi.leppanen@jolla.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | findutils/grep.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/findutils/grep.c b/findutils/grep.c index 2cbe7ea91..5b8644c36 100644 --- a/findutils/grep.c +++ b/findutils/grep.c | |||
@@ -60,7 +60,7 @@ | |||
60 | 60 | ||
61 | /* options */ | 61 | /* options */ |
62 | //usage:#define grep_trivial_usage | 62 | //usage:#define grep_trivial_usage |
63 | //usage: "[-HhnlLoqvsriwFE" | 63 | //usage: "[-HhnlLoqvsrRiwFE" |
64 | //usage: IF_EXTRA_COMPAT("z") | 64 | //usage: IF_EXTRA_COMPAT("z") |
65 | //usage: "] [-m N] " | 65 | //usage: "] [-m N] " |
66 | //usage: IF_FEATURE_GREP_CONTEXT("[-A/B/C N] ") | 66 | //usage: IF_FEATURE_GREP_CONTEXT("[-A/B/C N] ") |
@@ -78,6 +78,7 @@ | |||
78 | //usage: "\n -v Select non-matching lines" | 78 | //usage: "\n -v Select non-matching lines" |
79 | //usage: "\n -s Suppress open and read errors" | 79 | //usage: "\n -s Suppress open and read errors" |
80 | //usage: "\n -r Recurse" | 80 | //usage: "\n -r Recurse" |
81 | //usage: "\n -R Recurse and dereference symlinks" | ||
81 | //usage: "\n -i Ignore case" | 82 | //usage: "\n -i Ignore case" |
82 | //usage: "\n -w Match whole words only" | 83 | //usage: "\n -w Match whole words only" |
83 | //usage: "\n -x Match whole lines only" | 84 | //usage: "\n -x Match whole lines only" |
@@ -108,7 +109,7 @@ | |||
108 | 109 | ||
109 | /* -e,-f are lists; -m,-A,-B,-C have numeric param */ | 110 | /* -e,-f are lists; -m,-A,-B,-C have numeric param */ |
110 | #define OPTSTR_GREP \ | 111 | #define OPTSTR_GREP \ |
111 | "lnqvscFiHhe:*f:*Lorm:+wx" \ | 112 | "lnqvscFiHhe:*f:*LorRm:+wx" \ |
112 | IF_FEATURE_GREP_CONTEXT("A:+B:+C:+") \ | 113 | IF_FEATURE_GREP_CONTEXT("A:+B:+C:+") \ |
113 | "E" \ | 114 | "E" \ |
114 | IF_EXTRA_COMPAT("z") \ | 115 | IF_EXTRA_COMPAT("z") \ |
@@ -131,6 +132,7 @@ enum { | |||
131 | OPTBIT_L, /* list unmatched file names only */ | 132 | OPTBIT_L, /* list unmatched file names only */ |
132 | OPTBIT_o, /* show only matching parts of lines */ | 133 | OPTBIT_o, /* show only matching parts of lines */ |
133 | OPTBIT_r, /* recurse dirs */ | 134 | OPTBIT_r, /* recurse dirs */ |
135 | OPTBIT_R, /* recurse dirs and symlinks to dirs */ | ||
134 | OPTBIT_m, /* -m MAX_MATCHES */ | 136 | OPTBIT_m, /* -m MAX_MATCHES */ |
135 | OPTBIT_w, /* -w whole word match */ | 137 | OPTBIT_w, /* -w whole word match */ |
136 | OPTBIT_x, /* -x whole line match */ | 138 | OPTBIT_x, /* -x whole line match */ |
@@ -154,6 +156,7 @@ enum { | |||
154 | OPT_L = 1 << OPTBIT_L, | 156 | OPT_L = 1 << OPTBIT_L, |
155 | OPT_o = 1 << OPTBIT_o, | 157 | OPT_o = 1 << OPTBIT_o, |
156 | OPT_r = 1 << OPTBIT_r, | 158 | OPT_r = 1 << OPTBIT_r, |
159 | OPT_R = 1 << OPTBIT_R, | ||
157 | OPT_m = 1 << OPTBIT_m, | 160 | OPT_m = 1 << OPTBIT_m, |
158 | OPT_w = 1 << OPTBIT_w, | 161 | OPT_w = 1 << OPTBIT_w, |
159 | OPT_x = 1 << OPTBIT_x, | 162 | OPT_x = 1 << OPTBIT_x, |
@@ -687,6 +690,7 @@ static int grep_dir(const char *dir) | |||
687 | int matched = 0; | 690 | int matched = 0; |
688 | recursive_action(dir, | 691 | recursive_action(dir, |
689 | /* recurse=yes */ ACTION_RECURSE | | 692 | /* recurse=yes */ ACTION_RECURSE | |
693 | /* followLinks=always */ ((option_mask32 & OPT_R) ? ACTION_FOLLOWLINKS : 0) | | ||
690 | /* followLinks=command line only */ ACTION_FOLLOWLINKS_L0 | | 694 | /* followLinks=command line only */ ACTION_FOLLOWLINKS_L0 | |
691 | /* depthFirst=yes */ ACTION_DEPTHFIRST, | 695 | /* depthFirst=yes */ ACTION_DEPTHFIRST, |
692 | /* fileAction= */ file_action_grep, | 696 | /* fileAction= */ file_action_grep, |
@@ -827,7 +831,7 @@ int grep_main(int argc UNUSED_PARAM, char **argv) | |||
827 | if (!cur_file || LONE_DASH(cur_file)) { | 831 | if (!cur_file || LONE_DASH(cur_file)) { |
828 | cur_file = "(standard input)"; | 832 | cur_file = "(standard input)"; |
829 | } else { | 833 | } else { |
830 | if (option_mask32 & OPT_r) { | 834 | if (option_mask32 & (OPT_r|OPT_R)) { |
831 | struct stat st; | 835 | struct stat st; |
832 | if (stat(cur_file, &st) == 0 && S_ISDIR(st.st_mode)) { | 836 | if (stat(cur_file, &st) == 0 && S_ISDIR(st.st_mode)) { |
833 | if (!(option_mask32 & OPT_h)) | 837 | if (!(option_mask32 & OPT_h)) |