find: add support for -delete, -path (by Natanael Copa)
authorDenis Vlasenko <vda.linux@googlemail.com>
Fri, 13 Apr 2007 10:00:12 +0000 (10:00 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Fri, 13 Apr 2007 10:00:12 +0000 (10:00 -0000)
findutils/Config.in
findutils/find.c
include/usage.h

index 09a5bb3cba5fff01e85fc091db29c28b7070d571..a32e989221938ecdc75a526796a890d35c3c277d 100644 (file)
@@ -135,6 +135,22 @@ config FEATURE_FIND_PRUNE
          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
index b77d36dc3b70c737885bbcb324610e6e2b17694a..aec22a5bc7f215e8d79ee959e317707681d226ba 100644 (file)
@@ -79,6 +79,8 @@ USE_FEATURE_FIND_GROUP( ACTS(group, gid_t gid;))
 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;
@@ -305,6 +307,28 @@ ACTF(prune)
 }
 #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)
+               bb_perror_msg("%s", 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)
 {
@@ -393,6 +417,8 @@ static action*** parse_params(char **argv)
        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        ,
@@ -420,6 +446,8 @@ static action*** parse_params(char **argv)
        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"    ,
@@ -656,6 +684,22 @@ static action*** parse_params(char **argv)
                        (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 d196afcbf6bca0a5600aeb60297f2961adadc37d..2fb8112b0a5dde0a7ac99d22667f618894272182 100644 (file)
        "\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" \
        )