find: print/print0/prune _can_ be inverted, fix it
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
27076b8233
commit
805f2453d0
207
findutils/find.c
207
findutils/find.c
@ -53,10 +53,6 @@
|
||||
* diff -u /tmp/std_find /tmp/bb_find && echo Identical
|
||||
*/
|
||||
|
||||
//applet:IF_FIND(APPLET_NOEXEC(find, find, BB_DIR_USR_BIN, BB_SUID_DROP, find))
|
||||
|
||||
//kbuild:lib-$(CONFIG_FIND) += find.o
|
||||
|
||||
//config:config FIND
|
||||
//config: bool "find"
|
||||
//config: default y
|
||||
@ -230,6 +226,106 @@
|
||||
//config: help
|
||||
//config: Support the 'find -links' option for matching number of links.
|
||||
|
||||
//applet:IF_FIND(APPLET_NOEXEC(find, find, BB_DIR_USR_BIN, BB_SUID_DROP, find))
|
||||
|
||||
//kbuild:lib-$(CONFIG_FIND) += find.o
|
||||
|
||||
//usage:#define find_trivial_usage
|
||||
//usage: "[PATH]... [OPTIONS] [ACTIONS]"
|
||||
//usage:#define find_full_usage "\n\n"
|
||||
//usage: "Search for files and perform actions on them.\n"
|
||||
//usage: "First failed action stops processing of current file.\n"
|
||||
//usage: "Defaults: PATH is current directory, action is '-print'\n"
|
||||
//usage: "\nOptions:"
|
||||
//usage: "\n -follow Follow symlinks"
|
||||
//usage: IF_FEATURE_FIND_XDEV(
|
||||
//usage: "\n -xdev Don't descend directories on other filesystems"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_MAXDEPTH(
|
||||
//usage: "\n -maxdepth N Descend at most N levels. -maxdepth 0 applies"
|
||||
//usage: "\n actions to command line arguments only"
|
||||
//usage: "\n -mindepth N Don't act on first N levels"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_DEPTH(
|
||||
//usage: "\n -depth Act on directory *after* traversing it"
|
||||
//usage: )
|
||||
//usage: "\n"
|
||||
//usage: "\nActions:"
|
||||
//usage: IF_FEATURE_FIND_PAREN(
|
||||
//usage: "\n ( ACTIONS ) Group actions for -o / -a"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_NOT(
|
||||
//usage: "\n ! ACT Invert ACT's success/failure"
|
||||
//usage: )
|
||||
//usage: "\n ACT1 [-a] ACT2 If ACT1 fails, stop, else do ACT2"
|
||||
//usage: "\n ACT1 -o ACT2 If ACT1 succeeds, stop, else do ACT2"
|
||||
//usage: "\n Note: -a has higher priority than -o"
|
||||
//usage: "\n -name PATTERN Match file name (w/o directory name) to PATTERN"
|
||||
//usage: "\n -iname PATTERN Case insensitive -name"
|
||||
//usage: IF_FEATURE_FIND_PATH(
|
||||
//usage: "\n -path PATTERN Match path to PATTERN"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_REGEX(
|
||||
//usage: "\n -regex PATTERN Match path to regex PATTERN"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_TYPE(
|
||||
//usage: "\n -type X File type is X (one of: f,d,l,b,c,...)"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_PERM(
|
||||
//usage: "\n -perm MASK At least one mask bit (+MASK), all bits (-MASK),"
|
||||
//usage: "\n or exactly MASK bits are set in mode bits"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_MTIME(
|
||||
//usage: "\n -mtime DAYS Modified time is greater than (+N), less than (-N),"
|
||||
//usage: "\n or exactly N days"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_MMIN(
|
||||
//usage: "\n -mmin MINS Modified time is greater than (+N), less than (-N),"
|
||||
//usage: "\n or exactly N minutes"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_NEWER(
|
||||
//usage: "\n -newer FILE Modified time is more recent than FILE's"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_INUM(
|
||||
//usage: "\n -inum N File has inode number N"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_USER(
|
||||
//usage: "\n -user NAME File is owned by user NAME (numeric user ID allowed)"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_GROUP(
|
||||
//usage: "\n -group NAME File belongs to group NAME (numeric group ID allowed)"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_SIZE(
|
||||
//usage: "\n -size N[bck] File size is N (c:bytes,k:kbytes,b:512 bytes(def.))"
|
||||
//usage: "\n +/-N: file size is bigger/smaller than N"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_LINKS(
|
||||
//usage: "\n -links N Number of links is greater than (+N), less than (-N),"
|
||||
//usage: "\n or exactly N"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_CONTEXT(
|
||||
//usage: "\n -context CTX File has specified security context"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_PRUNE(
|
||||
//usage: "\n -prune If current file is directory, don't descend into it"
|
||||
//usage: )
|
||||
//usage: "\nIf none of the following actions is specified, -print is assumed"
|
||||
//usage: "\n -print Print file name"
|
||||
//usage: IF_FEATURE_FIND_PRINT0(
|
||||
//usage: "\n -print0 Print file name, NUL terminated"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_EXEC(
|
||||
//usage: "\n -exec CMD ARG ; Run CMD with all instances of {} replaced by"
|
||||
//usage: "\n file name. Fails if CMD exits with nonzero"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_DELETE(
|
||||
//usage: "\n -delete Delete current file/directory. Turns on -depth option"
|
||||
//usage: )
|
||||
//usage:
|
||||
//usage:#define find_example_usage
|
||||
//usage: "$ find / -name passwd\n"
|
||||
//usage: "/etc/passwd\n"
|
||||
|
||||
#include <fnmatch.h>
|
||||
#include "libbb.h"
|
||||
#if ENABLE_FEATURE_FIND_REGEX
|
||||
@ -815,20 +911,16 @@ static action*** parse_params(char **argv)
|
||||
/* --- Tests and actions --- */
|
||||
else if (parm == PARM_print) {
|
||||
G.need_print = 0;
|
||||
/* GNU find ignores '!' here: "find ! -print" */
|
||||
IF_FEATURE_FIND_NOT( invert_flag = 0; )
|
||||
(void) ALLOC_ACTION(print);
|
||||
}
|
||||
#if ENABLE_FEATURE_FIND_PRINT0
|
||||
else if (parm == PARM_print0) {
|
||||
G.need_print = 0;
|
||||
IF_FEATURE_FIND_NOT( invert_flag = 0; )
|
||||
(void) ALLOC_ACTION(print0);
|
||||
}
|
||||
#endif
|
||||
#if ENABLE_FEATURE_FIND_PRUNE
|
||||
else if (parm == PARM_prune) {
|
||||
IF_FEATURE_FIND_NOT( invert_flag = 0; )
|
||||
(void) ALLOC_ACTION(prune);
|
||||
}
|
||||
#endif
|
||||
@ -844,7 +936,6 @@ static action*** parse_params(char **argv)
|
||||
int i;
|
||||
action_exec *ap;
|
||||
G.need_print = 0;
|
||||
IF_FEATURE_FIND_NOT( invert_flag = 0; )
|
||||
ap = ALLOC_ACTION(exec);
|
||||
ap->exec_argv = ++argv; /* first arg after -exec */
|
||||
/*ap->exec_argc = 0; - ALLOC_ACTION did it */
|
||||
@ -1043,102 +1134,6 @@ static action*** parse_params(char **argv)
|
||||
#undef ALLOC_ACTION
|
||||
}
|
||||
|
||||
//usage:#define find_trivial_usage
|
||||
//usage: "[PATH]... [OPTIONS] [ACTIONS]"
|
||||
//usage:#define find_full_usage "\n\n"
|
||||
//usage: "Search for files and perform actions on them.\n"
|
||||
//usage: "First failed action stops processing of current file.\n"
|
||||
//usage: "Defaults: PATH is current directory, action is '-print'\n"
|
||||
//usage: "\nOptions:"
|
||||
//usage: "\n -follow Follow symlinks"
|
||||
//usage: IF_FEATURE_FIND_XDEV(
|
||||
//usage: "\n -xdev Don't descend directories on other filesystems"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_MAXDEPTH(
|
||||
//usage: "\n -maxdepth N Descend at most N levels. -maxdepth 0 applies"
|
||||
//usage: "\n actions to command line arguments only"
|
||||
//usage: "\n -mindepth N Don't act on first N levels"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_DEPTH(
|
||||
//usage: "\n -depth Act on directory *after* traversing it"
|
||||
//usage: )
|
||||
//usage: "\n"
|
||||
//usage: "\nActions:"
|
||||
//usage: IF_FEATURE_FIND_PAREN(
|
||||
//usage: "\n ( ACTIONS ) Group actions for -o / -a"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_NOT(
|
||||
//usage: "\n ! ACT Invert ACT's success/failure"
|
||||
//usage: )
|
||||
//usage: "\n ACT1 [-a] ACT2 If ACT1 fails, stop, else do ACT2"
|
||||
//usage: "\n ACT1 -o ACT2 If ACT1 succeeds, stop, else do ACT2"
|
||||
//usage: "\n Note: -a has higher priority than -o"
|
||||
//usage: "\n -name PATTERN Match file name (w/o directory name) to PATTERN"
|
||||
//usage: "\n -iname PATTERN Case insensitive -name"
|
||||
//usage: IF_FEATURE_FIND_PATH(
|
||||
//usage: "\n -path PATTERN Match path to PATTERN"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_REGEX(
|
||||
//usage: "\n -regex PATTERN Match path to regex PATTERN"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_TYPE(
|
||||
//usage: "\n -type X File type is X (one of: f,d,l,b,c,...)"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_PERM(
|
||||
//usage: "\n -perm MASK At least one mask bit (+MASK), all bits (-MASK),"
|
||||
//usage: "\n or exactly MASK bits are set in mode bits"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_MTIME(
|
||||
//usage: "\n -mtime DAYS Modified time is greater than (+N), less than (-N),"
|
||||
//usage: "\n or exactly N days"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_MMIN(
|
||||
//usage: "\n -mmin MINS Modified time is greater than (+N), less than (-N),"
|
||||
//usage: "\n or exactly N minutes"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_NEWER(
|
||||
//usage: "\n -newer FILE Modified time is more recent than FILE's"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_INUM(
|
||||
//usage: "\n -inum N File has inode number N"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_USER(
|
||||
//usage: "\n -user NAME File is owned by user NAME (numeric user ID allowed)"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_GROUP(
|
||||
//usage: "\n -group NAME File belongs to group NAME (numeric group ID allowed)"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_SIZE(
|
||||
//usage: "\n -size N[bck] File size is N (c:bytes,k:kbytes,b:512 bytes(def.))"
|
||||
//usage: "\n +/-N: file size is bigger/smaller than N"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_LINKS(
|
||||
//usage: "\n -links N Number of links is greater than (+N), less than (-N),"
|
||||
//usage: "\n or exactly N"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_CONTEXT(
|
||||
//usage: "\n -context CTX File has specified security context"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_PRUNE(
|
||||
//usage: "\n -prune If current file is directory, don't descend into it"
|
||||
//usage: )
|
||||
//usage: "\nIf none of the following actions is specified, -print is assumed"
|
||||
//usage: "\n -print Print file name"
|
||||
//usage: IF_FEATURE_FIND_PRINT0(
|
||||
//usage: "\n -print0 Print file name, NUL terminated"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_EXEC(
|
||||
//usage: "\n -exec CMD ARG ; Run CMD with all instances of {} replaced by"
|
||||
//usage: "\n file name. Fails if CMD exits with nonzero"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_FIND_DELETE(
|
||||
//usage: "\n -delete Delete current file/directory. Turns on -depth option"
|
||||
//usage: )
|
||||
//usage:
|
||||
//usage:#define find_example_usage
|
||||
//usage: "$ find / -name passwd\n"
|
||||
//usage: "/etc/passwd\n"
|
||||
|
||||
int find_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||
int find_main(int argc UNUSED_PARAM, char **argv)
|
||||
{
|
||||
@ -1187,7 +1182,7 @@ IF_FEATURE_FIND_DEPTH( OPT_DEPTH ,)
|
||||
* expression is reached.
|
||||
* We implement: -follow, -xdev, -mindepth, -maxdepth, -depth
|
||||
*/
|
||||
/* Process options, and replace then with -a */
|
||||
/* Process options, and replace them with -a */
|
||||
/* (-a will be ignored by recursive parser later) */
|
||||
argp = &argv[firstopt];
|
||||
while ((arg = argp[0]) != NULL) {
|
||||
|
Loading…
Reference in New Issue
Block a user