A multi-threaded, cross-platform C++ utility for recursively searching through directories for text patterns, with optional case sensitivity, regular expression support, and result highlighting similar to grep.
- Recursive directory search
- Multi-threaded file processing
- Case-sensitive or case-insensitive matching
- Optional regular expression support
- Highlighting of matched patterns in output
- Unit-tested and modular design
- Portable: Windows, Linux, and macOS compatible
- Doxygen configured and documented
- CMake 3.16+
- C++20-compatible compiler (GCC, Clang, MSVC)
- Ninja (optional but recommended for faster builds)
- Gradle (optional)
- Doxygen (optional)
These tools are optional but recommended for full development workflow (faster builds, documentation, extra Gradle-based tasks).
Ubuntu / Debian
sudo apt-get update
sudo apt-get install ninja-build doxygen gradlemacOS (with Homebrew)
brew update
brew install ninja doxygen gradleWindows (with Chocolatey)
Run Command Prompt or PowerShell as Administrator:choco install ninja doxygen gradlemkdir build && cd build
cmake -G"Ninja" .. -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake
ninjaninja runUnitTests# Build the project
gradle build
# Clean main build
gradle clean
# Clean everything
gradle cleanAll
# Run unit tests
gradle runTests
build/src/FileSearcher <directory> <query> [--ignore-case] [--regex]# Simple case-sensitive search
build/src/FileSearcher ./examples "Paris"
# Case-sensitive search
build/src/FileSearcher ./examples "architecture"
# Case-insensitive search
build/src/FileSearcher ./examples "architecture" --ignore-case
# Regex search with highlighting
build/src/FileSearcher ./examples "tec." --regex
build/src/FileSearcher examples "tec.*" --ignore-case --regex-
FileSearcher: Interface for file searching.
-
TextFileSearcher: Implements the search logic using regex or plain search.
-
SearchManager: Manages file distribution and threading.
-
HighlightMatches: Highlights matches inline using ANSI colors.
-
Modular Design with CMake for build Structure and Dependency handling