#
# 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 option"
	default y
	depends on FIND
	help
	  Causes output names to be separated by a null 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 modified time matching (-mtime) option"
	default y
	depends on FIND
	help
	  Allow searching based on the modification time of
	  files, in days.

config FEATURE_FIND_MMIN
	bool "Enable modified time matching (-min) option"
	default y
	depends on FIND
	help
	  Allow searching based on the modification time of
	  files, in minutes.

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

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

config FEATURE_FIND_XDEV
	bool "Enable stay in filesystem (-xdev) option"
	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 option"
	default y
	depends on FIND
	help
	  This option enables -maxdepth N option.

config FEATURE_FIND_NEWER
	bool "Enable -newer option for comparing file mtimes"
	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 inode number matching (-inum) option"
	default y
	depends on FIND
	help
	  Support the 'find -inum' option for searching by inode number.

config FEATURE_FIND_EXEC
	bool "Enable (-exec) option allowing execution of 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 username/uid matching (-user) option"
	default y
	depends on FIND
	help
	  Support the 'find -user' option for searching by username or uid.

config FEATURE_FIND_GROUP
	bool "Enable group/gid matching (-group) option"
	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 the -depth option"
	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) option allowing matching for file size"
	default y
	depends on FIND
	help
	  Support the 'find -size' option for searching by file size.

config FEATURE_FIND_PRUNE
	bool "Enable (-prune) option allowing to 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 option allowing to delete files"
	default n
	depends on FIND && FEATURE_FIND_DEPTH
	help
	  Support the 'find -delete' option for deleting files and direcotries.
	  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 option allowing to match pathname patterns"
	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 to regex"
	default y
	depends on FIND
	help
	  The -regex option matches whole pathname against regular expression.

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

config FEATURE_GREP_EGREP_ALIAS
	bool "Support 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 is always builtin, 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 on
	  every item from standard input.

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

config FEATURE_XARGS_SUPPORT_QUOTES
	bool "Enable support single and double quotes and backslash"
	default n
	depends on XARGS
	help
	  Default xargs unsupport single and double quotes
	  and backslash for can use aruments with spaces.

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

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

endmenu
