#
# For a description of the syntax of this configuration file,
# see scripts/kbuild/config-language.txt.
#

menu "Finding Utilities"

config FIND
	bool "find"
	default n
	help
	  find is used to search your system to find specified files.

config FEATURE_FIND_PRINT0
	bool "Enable -print0: NUL-terminated output"
	default y
	depends on FIND
	help
	  Causes output names to be separated by a NUL character
	  rather than a newline. This allows names that contain
	  newlines and other whitespace to be more easily
	  interpreted by other programs.

config FEATURE_FIND_MTIME
	bool "Enable -mtime: modified time matching"
	default y
	depends on FIND
	help
	  Allow searching based on the modification time of
	  files, in days.

config FEATURE_FIND_MMIN
	bool "Enable -mmin: modified time matching by minutes"
	default y
	depends on FIND
	help
	  Allow searching based on the modification time of
	  files, in minutes.

config FEATURE_FIND_PERM
	bool "Enable -perm: permissions matching"
	default y
	depends on FIND
	help
	  Enable searching based on file permissions.

config FEATURE_FIND_TYPE
	bool "Enable -type: file type matching (file/dir/link/...)"
	default y
	depends on FIND
	help
	  Enable searching based on file type (file,
	  directory, socket, device, etc.).

config FEATURE_FIND_XDEV
	bool "Enable -xdev: 'stay in filesystem'"
	default y
	depends on FIND
	help
	  This option allows find to restrict searches to a single filesystem.

config FEATURE_FIND_MAXDEPTH
	bool "Enable -maxdepth N"
	default y
	depends on FIND
	help
	  This option enables -maxdepth N option.

config FEATURE_FIND_NEWER
	bool "Enable -newer: compare file modification times"
	default y
	depends on FIND
	help
	  Support the 'find -newer' option for finding any files which have
	  a modified time that is more recent than the specified FILE.

config FEATURE_FIND_INUM
	bool "Enable -inum: inode number matching"
	default y
	depends on FIND
	help
	  Support the 'find -inum' option for searching by inode number.

config FEATURE_FIND_EXEC
	bool "Enable -exec: execute commands"
	default y
	depends on FIND
	help
	  Support the 'find -exec' option for executing commands based upon
	  the files matched.

config FEATURE_FIND_USER
	bool "Enable -user: username/uid matching"
	default y
	depends on FIND
	help
	  Support the 'find -user' option for searching by username or uid.

config FEATURE_FIND_GROUP
	bool "Enable -group: group/gid matching"
	default y
	depends on FIND
	help
	  Support the 'find -group' option for searching by group name or gid.

config FEATURE_FIND_NOT
	bool "Enable the 'not' (!) operator"
	default y
	depends on FIND
	help
	  Support the '!' operator to invert the test results.
	  If 'Enable full-blown desktop' is enabled, then will also support
	  the non-POSIX notation '-not'.

config FEATURE_FIND_DEPTH
	bool "Enable -depth"
	default y
	depends on FIND
	help
	  Process each directory's contents before the directory itself.

config FEATURE_FIND_PAREN
	bool "Enable parens in options"
	default y
	depends on FIND
	help
	  Enable usage of parens '(' to specify logical order of arguments.

config FEATURE_FIND_SIZE
	bool "Enable -size: file size matching"
	default y
	depends on FIND
	help
	  Support the 'find -size' option for searching by file size.

config FEATURE_FIND_PRUNE
	bool "Enable -prune: exclude subdirectories"
	default y
	depends on FIND
	help
	  If the file is a directory, dont descend into it. Useful for
	  exclusion .svn and CVS directories.

config FEATURE_FIND_DELETE
	bool "Enable -delete: delete files/dirs"
	default n
	depends on FIND && FEATURE_FIND_DEPTH
	help
	  Support the 'find -delete' option for deleting files and directories.
	  WARNING: This option can do much harm if used wrong. Busybox will not
	  try to protect the user from doing stupid things. Use with care.

config FEATURE_FIND_PATH
	bool "Enable -path: match pathname with shell pattern"
	default y
	depends on FIND
	help
	  The -path option matches whole pathname instead of just filename.

config FEATURE_FIND_REGEX
	bool "Enable -regex: match pathname with regex"
	default y
	depends on FIND
	help
	  The -regex option matches whole pathname against regular expression.

config FEATURE_FIND_CONTEXT
	bool "Enable -context: security context matching"
	default n
	depends on FIND && SELINUX
	help
	  Support the 'find -context' option for matching security context.

config GREP
	bool "grep"
	default n
	help
	  grep is used to search files for a specified pattern.

config FEATURE_GREP_EGREP_ALIAS
	bool "Enable extended regular expressions (egrep & grep -E)"
	default y
	depends on GREP
	help
	  Enabled support for extended regular expressions. Extended
	  regular expressions allow for alternation (foo|bar), grouping,
	  and various repetition operators.

config FEATURE_GREP_FGREP_ALIAS
	bool "Alias fgrep to grep -F"
	default y
	depends on GREP
	help
	  fgrep sees the search pattern as a normal string rather than
	  regular expressions.
	  grep -F always works, this just creates the fgrep alias.

config FEATURE_GREP_CONTEXT
	bool "Enable before and after context flags (-A, -B and -C)"
	default y
	depends on GREP
	help
	  Print the specified number of leading (-B) and/or trailing (-A)
	  context surrounding our matching lines.
	  Print the specified number of context lines (-C).

config XARGS
	bool "xargs"
	default n
	help
	  xargs is used to execute a specified command for
	  every item from standard input.

config FEATURE_XARGS_SUPPORT_CONFIRMATION
	bool "Enable -p: prompt and confirmation"
	default n
	depends on XARGS
	help
	  Support -p: prompt the user whether to run each command
	  line and read a line from the terminal.

config FEATURE_XARGS_SUPPORT_QUOTES
	bool "Enable single and double quotes and backslash"
	default n
	depends on XARGS
	help
	  Support quoting in the input.

config FEATURE_XARGS_SUPPORT_TERMOPT
	bool "Enable -x: exit if -s or -n is exceeded"
	default n
	depends on XARGS
	help
	  Support -x: exit if the command size (see the -s or -n option)
	  is exceeded.

config FEATURE_XARGS_SUPPORT_ZERO_TERM
	bool "Enable -0: NUL-terminated input"
	default n
	depends on XARGS
	help
	  Support -0: input items are terminated by a NUL character
	  instead of whitespace, and the quotes and backslash
	  are not special.

endmenu
