* find/find.1 - Fix -prune SCM example directories and make it more efficient * doc/find.texi - Make -prune SCM example more efficient (two ways) * NEWS - Mention the above --- NEWS | 3 +++ doc/find.texi | 25 +++++++++++++++++++++---- find/find.1 | 13 ++++++++++++- 3 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/NEWS b/NEWS index 1fff34f8..7c6fcfb3 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,9 @@ GNU findutils NEWS - User visible changes. -*- outline -*- (allout) When generating the Texinfo manual, `makeinfo` is invoked with the --no-split option for all output formats now; this avoids files like find.info-[12]. + The find.1 manual's -prune SCM example directories/output have been fixed, and + the example itself has been made more efficient (find.1 and find.texi) [#62259] + Also fixed a typo in find.texi. * Noteworthy changes in release 4.9.0 (2022-02-22) [stable] diff --git a/doc/find.texi b/doc/find.texi index 379fe646..1a36e243 100644 --- a/doc/find.texi +++ b/doc/find.texi @@ -5138,13 +5138,15 @@ already found. @smallexample find repo/ \ --exec test -d @{@}/.svn \; -or \ --exec test -d @{@}/.git \; -or \ --exec test -d @{@}/CVS \; -print -prune +-type d \ +\( -exec test -d @{@}/.svn \; \ +-or -exec test -d @{@}/.git \; \ +-or -exec test -d @{@}/CVS \; \ +\) -print -prune @end smallexample In this example, @command{test} is used to tell if we are currently -examining a directory which appears to the a project's root directory +examining a directory which appears to be a project's root directory (because it has an SCM subdirectory). When we find a project root, there is no need to search inside it, and @code{-prune} makes sure that we descend no further. @@ -5153,6 +5155,21 @@ For large, complex trees like the Linux kernel, this will prevent searching a large portion of the structure, saving a good deal of time. +The @samp{-type d} clause causes the three @samp{test} shell +processes to only be executed for directories. This can be made even +more efficient by combining the three @samp{test} shell processes +into a single process: + +@smallexample +find repo/ \ +-type d \ +-exec sh -c 'test -d "$1"/.svn || test -d "$1"/.git || test -d "$1"/CVS' . {} \; \ +-print -prune +@end smallexample + +Note that the @samp{.} argument is just a placeholder for the unused +@samp{$0} environment variable in the @samp{sh -c} command. The +@samp{@{@}} argument is the @samp{$1} environment variable. @node Security Considerations @chapter Security Considerations diff --git a/find/find.1 b/find/find.1 index 429aa2f0..4faaa23b 100644 --- a/find/find.1 +++ b/find/find.1 @@ -2494,6 +2494,7 @@ projects' roots: .in +4m .B $ find repo/ \e .in +4m +.B \-type d \e .B \e( \-exec test \-d \(aq{}/.svn\(aq \e; \e .B \-or \-exec test \-d \(aq{}/.git\(aq \e; \e .B \-or \-exec test \-d \(aq{}/CVS\(aq \e; \e @@ -2502,7 +2503,7 @@ projects' roots: .in -4m \& .fi -Sample output: +Sample directories: .nf \& .in +4m @@ -2513,6 +2514,16 @@ Sample output: .B repo/project4/.git .in \& +Sample output: +.nf +\& +.in +4m +.B repo/project1 +.B repo/gnu/project2 +.B repo/gnu/project3 +.B repo/project4 +.in +\& .fi In this example, .B \-prune -- 2.30.2