Files
coyote/assets/functions/tools/fs_glob.sh
T

71 lines
2.4 KiB
Bash

#!/usr/bin/env bash
set -e
# @describe Find files by glob pattern. Returns matching file paths sorted by modification time.
# Use this to discover files before reading them.
# @option --pattern! The glob pattern to match files against (e.g. "**/*.rs", "src/**/*.ts", "*.yaml")
# @option --path The directory to search in (defaults to current working directory)
# @env LLM_OUTPUT=/dev/stdout The output path
MAX_RESULTS=100
main() {
# shellcheck disable=SC2154
local glob_pattern="$argc_pattern"
local search_path="${argc_path:-.}"
if [[ ! -d "$search_path" ]]; then
echo "Error: directory not found: $search_path" >&2
exit 1
fi
local results
if command -v fd &>/dev/null; then
results=$(fd --type f --glob "$glob_pattern" "$search_path" \
--exclude '.git' \
--exclude 'node_modules' \
--exclude 'target' \
--exclude 'dist' \
--exclude '__pycache__' \
--exclude 'vendor' \
--exclude '.build' \
2>/dev/null | head -n "$MAX_RESULTS") || true
else
local name_pattern dir_prefix effective_search
name_pattern="${glob_pattern##*/}"
[[ -z "$name_pattern" || "$name_pattern" == "**" ]] && name_pattern="*"
if [[ "$glob_pattern" == */* ]]; then
dir_prefix="${glob_pattern%%\**}"
dir_prefix="${dir_prefix%/}"
effective_search="${search_path}${dir_prefix:+/$dir_prefix}"
else
effective_search="$search_path"
fi
[[ -d "$effective_search" ]] || effective_search="$search_path"
results=$(find "$effective_search" -type f -name "$name_pattern" \
-not -path '*/.git/*' \
-not -path '*/node_modules/*' \
-not -path '*/target/*' \
-not -path '*/dist/*' \
-not -path '*/__pycache__/*' \
-not -path '*/vendor/*' \
-not -path '*/.build/*' \
2>/dev/null | head -n "$MAX_RESULTS") || true
fi
if [[ -z "$results" ]]; then
echo "No files found matching: $glob_pattern" >> "$LLM_OUTPUT"
return 0
fi
echo "$results" >> "$LLM_OUTPUT"
local count
count=$(echo "$results" | wc -l)
if [[ "$count" -ge "$MAX_RESULTS" ]]; then
printf "\n(Results limited to %s files. Use a more specific pattern.)\n" "$MAX_RESULTS" >> "$LLM_OUTPUT"
fi
}