From 0a02c7a926928f2e8d7e2e62df4a12e566e0a7fb Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Sun, 27 Aug 2023 16:46:31 +0100 Subject: [PATCH] find: Add the `-regex` and `-iregex` options These options match a given regular expression against the whole file path. `-iregex` is identical to `-regex` except it is case-insensitive. --- Userland/Utilities/CMakeLists.txt | 1 + Userland/Utilities/find.cpp | 33 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/Userland/Utilities/CMakeLists.txt b/Userland/Utilities/CMakeLists.txt index cf63c82563..3b378a6a04 100644 --- a/Userland/Utilities/CMakeLists.txt +++ b/Userland/Utilities/CMakeLists.txt @@ -92,6 +92,7 @@ target_link_libraries(disasm PRIVATE LibX86) target_link_libraries(expr PRIVATE LibRegex) target_link_libraries(fdtdump PRIVATE LibDeviceTree) target_link_libraries(file PRIVATE LibGfx LibIPC LibArchive LibCompress LibAudio) +target_link_libraries(find PRIVATE LibRegex) target_link_libraries(functrace PRIVATE LibDebug LibX86) target_link_libraries(glsl-compiler PRIVATE LibGLSL) target_link_libraries(gml-format PRIVATE LibGUI) diff --git a/Userland/Utilities/find.cpp b/Userland/Utilities/find.cpp index c75c31fc41..0727d2a507 100644 --- a/Userland/Utilities/find.cpp +++ b/Userland/Utilities/find.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -267,6 +268,24 @@ private: CaseSensitivity m_case_sensitivity { CaseSensitivity::CaseSensitive }; }; +class RegexCommand : public Command { +public: + RegexCommand(Regex&& regex) + : m_regex(move(regex)) + { + } + +private: + virtual bool evaluate(FileData& file_data) const override + { + auto haystack = file_data.full_path.string(); + auto match_result = m_regex.match(haystack); + return match_result.success; + } + + Regex m_regex; +}; + class AccessCommand final : public Command { public: AccessCommand(mode_t mode) @@ -426,6 +445,20 @@ static OwnPtr parse_simple_command(Vector& args) if (args.is_empty()) fatal_error("-iname: requires additional arguments"); return make(args.take_first(), CaseSensitivity::CaseInsensitive); + } else if (arg == "-regex") { + if (args.is_empty()) + fatal_error("-regex: requires additional arguments"); + Regex regex { args.take_first(), PosixFlags::Default }; + if (regex.parser_result.error != regex::Error::NoError) + fatal_error("{}", regex.error_string()); + return make(move(regex)); + } else if (arg == "-iregex") { + if (args.is_empty()) + fatal_error("-iregex: requires additional arguments"); + Regex regex { args.take_first(), PosixFlags::Insensitive }; + if (regex.parser_result.error != regex::Error::NoError) + fatal_error("{}", regex.error_string()); + return make(move(regex)); } else if (arg == "-readable") { return make(R_OK); } else if (arg == "-writable") {