implement -print0 for find
authorPaul Fox <pgf@brightstareng.com>
Fri, 12 May 2006 14:47:20 +0000 (14:47 -0000)
committerPaul Fox <pgf@brightstareng.com>
Fri, 12 May 2006 14:47:20 +0000 (14:47 -0000)
findutils/Config.in
findutils/find.c
include/usage.h

index 3a9a506d7292c9ea5d163179dabe5c86560f2fe0..8329a6c1fc10223e3d10b63ea533ac1fcbb8cbe6 100644 (file)
@@ -11,6 +11,16 @@ config CONFIG_FIND
        help
          find is used to search your system to find specified files.
 
+config CONFIG_FEATURE_FIND_PRINT0
+       bool "Enable -print0 option"
+       default y
+       depends on CONFIG_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 CONFIG_FEATURE_FIND_MTIME
        bool "Enable modified time matching (-mtime) option"
        default y
index 7a71af9eb6f8fa0d27c6a171cff917ea89f31156..17a1a565661bc3c5cc76aa503f81175f30554588 100644 (file)
@@ -38,6 +38,9 @@ static const char msg_req_arg[] = "option `%s' requires an argument";
 static const char msg_invalid_arg[] = "invalid argument `%s' to `%s'";
 
 static char *pattern;
+#ifdef CONFIG_FEATURE_FIND_PRINT0
+static char printsep = '\n';
+#endif
 
 #ifdef CONFIG_FEATURE_FIND_TYPE
 static int type_mask = 0;
@@ -159,7 +162,11 @@ static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
        }
 #endif
 
+#ifdef CONFIG_FEATURE_FIND_PRINT0
+       printf("%s%c", fileName, printsep);
+#else
        puts(fileName);
+#endif
 no_match:
        return (TRUE);
 }
@@ -217,6 +224,10 @@ int find_main(int argc, char **argv)
                else if (strcmp(argv[i], "-print") == 0) {
                        ;
                        }
+#ifdef CONFIG_FEATURE_FIND_PRINT0
+               else if (strcmp(argv[i], "-print0") == 0)
+                       printsep = '\0';
+#endif
                else if (strcmp(argv[i], "-name") == 0) {
                        if (++i == argc)
                                bb_error_msg_and_die(msg_req_arg, "-name");
index d09c1108ebd82b975c411d99b7363a9f7665c44f..0e3ecae054abb16a5b53649813143a383d080e29 100644 (file)
@@ -748,7 +748,9 @@ USE_FEATURE_DATE_ISOFMT( \
        "\t-follow\t\tDereference symbolic links\n" \
        "\t-name PATTERN\tFile name (leading directories removed) matches PATTERN\n" \
        "\t-print\t\tPrint (default and assumed)\n" \
-       USE_FEATURE_FIND_TYPE( \
+       USE_FEATURE_FIND_PRINT0( \
+       "\t-print0\t\tDelimit output with null characters rather than\n\t\t\tnewlines" \
+) USE_FEATURE_FIND_TYPE( \
        "\n\t-type X\t\tFiletype matches X (where X is one of: f,d,l,b,c,...)" \
 ) USE_FEATURE_FIND_PERM( \
        "\n\t-perm PERMS\tPermissions match any of (+NNN); all of (-NNN);\n\t\t\tor exactly (NNN)" \