Explorar o código

find: Implement support for multiple directories

Tim Schumacher %!s(int64=3) %!d(string=hai) anos
pai
achega
0ca63cfd6e
Modificáronse 2 ficheiros con 23 adicións e 18 borrados
  1. 3 3
      Base/usr/share/man/man1/find.md
  2. 20 15
      Userland/Utilities/find.cpp

+ 3 - 3
Base/usr/share/man/man1/find.md

@@ -5,13 +5,13 @@ find - recursively search for files
 ## Synopsis
 
 ```**sh
-$ find [-L] [root-path] [commands...]
+$ find [-L] [root-paths...] [commands...]
 ```
 
 ## Description
 
-`find` recursively traverses the file hierarchy starting at the given root path
-(or at the current working directory if the root path is not specified), and
+`find` recursively traverses the file hierarchy starting at the given root paths
+(or at the current working directory if no root paths have been specified), and
 evaluates the given commands for each found file. The commands can be used to
 both filter the set of files and to perform actions on them.
 

+ 20 - 15
Userland/Utilities/find.cpp

@@ -541,7 +541,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
     args.append(arguments.argv + 1, arguments.argc - 1);
 
     OwnPtr<Command> command;
-    LexicalPath root_path = LexicalPath(".");
+    Vector<LexicalPath> paths;
 
     while (!args.is_empty()) {
         char* raw_arg = args.take_first();
@@ -549,7 +549,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
         if (arg == "-L") {
             g_follow_symlinks = true;
         } else if (!arg.starts_with('-')) {
-            root_path = LexicalPath(arg);
+            paths.append(LexicalPath(arg));
         } else {
             // No special case, so add back the argument and try to parse a command.
             args.prepend(raw_arg);
@@ -560,21 +560,26 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
     if (!command)
         command = make<PrintCommand>();
 
-    String dirname = root_path.dirname();
-    String basename = root_path.basename();
+    if (paths.is_empty())
+        paths.append(LexicalPath("."));
 
-    int dirfd = TRY(Core::System::open(dirname, O_RDONLY | O_DIRECTORY | O_CLOEXEC));
+    for (auto& path : paths) {
+        String dirname = path.dirname();
+        String basename = path.basename();
 
-    FileData file_data {
-        root_path,
-        dirfd,
-        basename.characters(),
-        (struct stat) {},
-        false,
-        DT_UNKNOWN,
-    };
-    walk_tree(file_data, *command);
-    close(dirfd);
+        int dirfd = TRY(Core::System::open(dirname, O_RDONLY | O_DIRECTORY | O_CLOEXEC));
+
+        FileData file_data {
+            path,
+            dirfd,
+            basename.characters(),
+            (struct stat) {},
+            false,
+            DT_UNKNOWN,
+        };
+        walk_tree(file_data, *command);
+        close(dirfd);
+    }
 
     return g_there_was_an_error ? 1 : 0;
 }