Skip to main content

Library to find the closest file matches to a reference.

Project description

busca

Build

busca logo

Simple interactive utility to find the closest matches to a reference file in a directory based on the number of lines in the reference file that exist in each compared file.

https://user-images.githubusercontent.com/49008873/235590754-efdeb134-feb1-44ec-bbac-44ccb737261a.mov

Table of Contents

Usage

🧑‍💻️ To see usage documentation, run

busca -h

Output for v2.0.0

Simple utility to find the closest matches to a reference file or piped input based on the number of lines in the reference that exist in each compared file

Usage: busca --ref-file-path <REF_FILE_PATH> [OPTIONS]
       <SomeCommand> | busca [OPTIONS]

Options:
  -r, --ref-file-path <REF_FILE_PATH>  Local or absolute path to the reference comparison file. Overrides any piped input
  -s, --search-path <SEARCH_PATH>      Directory or file in which to search. Defaults to CWD
  -m, --max-lines <MAX_LINES>          The number of lines to consider when comparing files. Files with more lines will be skipped [default: 10000]
  -i, --include-glob <INCLUDE_GLOB>    Globs that qualify a file for comparison
  -x, --exclude-glob <EXCLUDE_GLOB>    Globs that disqualify a file from comparison
  -c, --count <COUNT>                  Number of results to display [default: 10]
  -h, --help                           Print help
  -V, --version                        Print version

Examples

Find files that most closely match the source file_5.py file in a search directory

 busca --ref-file-path sample_dir_mix/file_5.py --search-path sample_dir_mix

? Select a file to compare:  
  sample_dir_mix/file_5.py                  ++++++++++  100.0%
> sample_dir_mix/file_5v2.py                ++++++++++   97.5%
  sample_dir_mix/nested_dir/file_7.py       ++++         42.3%
  sample_dir_mix/aldras/aldras_settings.py  ++           24.1%
  sample_dir_mix/aldras/aldras_core.py      ++           21.0%
  sample_dir_mix/file_3.py                  +            13.2%
  sample_dir_mix/file_1.py                  +            11.0%
  sample_dir_mix/file_2.py                  +             9.4%
  sample_dir_mix/aldras/aldras_execute.py   +             7.5%
  sample_dir_mix/file_4.py                  +             6.9%
[↑↓ to move, enter to select, type to filter]

Find files that most closely match the source path_to_reference.json file in a search directory

busca --ref-file-path path_to_reference.json --search-path path_to_search_dir

Change search to scan the current working directory

busca --ref-file-path path_to_reference.json

Narrow search to only consider .json files whose paths include the substring "foo" and that contain fewer than 1,000 lines

busca --ref-file-path path_to_reference.json --include-glob '*.json' --include-glob '**foo**' --max-lines 1000

Piped input mode to search the output of a command

# <SomeCommand> | busca [OPTIONS]
echo 'String to find in files.' | busca

MacOS piped input mode

📝 There is an open issue for MacOS in crossterm, one of busca's dependencies, that does not allow prompt interactivity when using piped input. Therefore, when a non interactive mode is detected, the file matches will be displayed but not interactively.

This can be worked around by adding the following aliases to your shell .bashrc or .zshrc file:

# Wrap commands for busca search
busca_cmd_output() {
    eval "$* > /tmp/busca_search.tmp" && busca -r /tmp/busca_search.tmp
}

One-liners to add the wrapper function:

Shell Command
Bash echo -e 'busca_cmd_output() {\n\teval "$* > /tmp/busca_search.tmp" && busca -r /tmp/busca_search.tmp\n}' >> ~/.bashrc
Zsh echo -e 'busca_cmd_output() {\n\teval "$* > /tmp/busca_search.tmp" && busca -r /tmp/busca_search.tmp\n}' >> ~/.zshrc

Reload your shell for the function to become available:

# busca_cmd_output <SomeCommand>
busca_cmd_output echo 'String to find in files.'

Installation

Mac OS

Homebrew

brew tap noahbaculi/busca
brew install busca

To update, run

brew update
brew upgrade busca

All platforms (Windows, MacOS, Linux)

Compile from source

  1. Install Rust using rustup.

  2. Clone this repo.

  3. In the root of this repo, run

    cargo build --release
    
  4. Add to path. For example, by copying the compiled binary to your local bin directory.

    cp target/release/busca $HOME/bin/
    

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

busca_py-2.0.1.tar.gz (6.1 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

busca_py-2.0.1-cp39-cp39-macosx_11_0_arm64.whl (315.2 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

Details for the file busca_py-2.0.1.tar.gz.

File metadata

  • Download URL: busca_py-2.0.1.tar.gz
  • Upload date:
  • Size: 6.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.2.3

File hashes

Hashes for busca_py-2.0.1.tar.gz
Algorithm Hash digest
SHA256 7a2af2718f2a6a8808710e16ba71bc9312fcc21c4d01b02ed3820f4fbe52b4b3
MD5 283d225ade88e741027527b30b21ef37
BLAKE2b-256 1622a9c79e2af3695912cf904cb3107cbd582876a92d298459d757ee52e3521a

See more details on using hashes here.

File details

Details for the file busca_py-2.0.1-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for busca_py-2.0.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c3db585d1dba7a24e84d353987aa871592bf691506d2934727d9e7094e059eb2
MD5 7df8ce15886b629d163d0439c3c970b3
BLAKE2b-256 f19944c43c929f72d2c47a7662f791db07544caef1967be157470f2dbc34ac41

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page