Hi,

Attached is a patch against current svn for optional support of the
-delete and -path option in the 'find' applet.

For the record: The -delete option can be dangerous. Use at your own
risk. (its turned off by default)

I was not sure about the use of perror(fileName) instead of
bb_perror_msg. 

I was thinking of a more verbose message like:

  bb_perror_msg("find: %s", fileName) 

but it would end up bigger and perror(fileName) seems to be good enough.

Comments?

Natanael Copa
Index: include/usage.h
===================================================================
--- include/usage.h	(revision 18376)
+++ include/usage.h	(working copy)
@@ -968,6 +968,10 @@
        "\n	-size N		File size is N" \
 	) USE_FEATURE_FIND_PRUNE( \
        "\n	-prune		Stop traversing current subtree" \
+        ) USE_FEATURE_FIND_DELETE( \
+       "\n	-delete		Delete files; Turns on -depth option" \
+        ) USE_FEATURE_FIND_PATH( \
+       "\n	-path		Path matches PATTERN" \
 	) USE_FEATURE_FIND_PAREN( \
        "\n	(EXPR)		Group an expression" \
 	)
Index: findutils/find.c
===================================================================
--- findutils/find.c	(revision 18376)
+++ findutils/find.c	(working copy)
@@ -76,6 +76,8 @@
 USE_FEATURE_FIND_PAREN( ACTS(paren, action ***subexpr;))
 USE_FEATURE_FIND_SIZE(  ACTS(size,  off_t size;))
 USE_FEATURE_FIND_PRUNE( ACTS(prune))
+USE_FEATURE_FIND_DELETE(ACTS(delete))
+USE_FEATURE_FIND_PATH(  ACTS(path, const char *pattern;))
 
 static action ***actions;
 static bool need_print = 1;
@@ -302,6 +304,28 @@
 }
 #endif
 
+#if ENABLE_FEATURE_FIND_DELETE
+ACTF(delete)
+{
+	int rc;
+	if (S_ISDIR(statbuf->st_mode)) {
+		rc = rmdir(fileName);
+	} else {
+		rc = unlink(fileName);
+	}
+	if (rc < 0)
+		perror(fileName);
+	return TRUE;
+}
+#endif
+
+#if ENABLE_FEATURE_FIND_PATH
+ACTF(path)
+{
+	return fnmatch(ap->pattern, fileName, 0) == 0;
+}
+#endif
+
 #if ENABLE_FEATURE_FIND_SIZE
 ACTF(size)
 {
@@ -390,6 +414,8 @@
 	USE_FEATURE_FIND_PAREN( PARM_char_brace,)
 	USE_FEATURE_FIND_SIZE(  PARM_size      ,)
 	USE_FEATURE_FIND_PRUNE( PARM_prune     ,)
+	USE_FEATURE_FIND_DELETE(PARM_delete    ,)
+	USE_FEATURE_FIND_PATH(  PARM_path      ,)
 #if ENABLE_DESKTOP
 	                        PARM_and       ,
 	                        PARM_or        ,
@@ -417,6 +443,8 @@
 	USE_FEATURE_FIND_PAREN( "("      ,)
 	USE_FEATURE_FIND_SIZE(  "-size"  ,)
 	USE_FEATURE_FIND_PRUNE( "-prune" ,)
+	USE_FEATURE_FIND_DELETE("-delete",)
+	USE_FEATURE_FIND_PATH(  "-path"  ,)
 #if ENABLE_DESKTOP
 	                        "-and"   ,
 	                        "-or"    ,
@@ -653,6 +681,22 @@
 			(void) ALLOC_ACTION(prune);
 		}
 #endif
+#if ENABLE_FEATURE_FIND_DELETE
+		else if (parm == PARM_delete) {
+			need_print = 0;
+			recurse_flags |= ACTION_DEPTHFIRST;
+			(void) ALLOC_ACTION(delete);
+		}
+#endif
+#if ENABLE_FEATURE_FIND_PATH
+		else if (parm == PARM_path) {
+			action_path *ap;
+			if (!*++argv)
+				bb_error_msg_and_die(bb_msg_requires_arg, arg);
+			ap = ALLOC_ACTION(path);
+			ap->pattern = arg1;
+		}
+#endif
 #if ENABLE_FEATURE_FIND_SIZE
 		else if (parm == PARM_size) {
 			action_size *ap;
Index: findutils/Config.in
===================================================================
--- findutils/Config.in	(revision 18376)
+++ findutils/Config.in	(working copy)
@@ -135,6 +135,22 @@
 	  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 pathnames instead of just filenames.
+
 config GREP
 	bool "grep"
 	default n
_______________________________________________
busybox mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/busybox

Reply via email to