This commit is contained in:
2026-02-25 16:39:22 +02:00
parent f84477f9b9
commit cf7f8609ac
8 changed files with 378 additions and 52 deletions

67
config/shared/bin/catfiles Executable file
View File

@@ -0,0 +1,67 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT="."
declare -a SKIP_DIRS=()
declare -a PATTERNS=()
usage() {
cat <<EOF
Usage: $0 [-r root_dir] [-s dir_to_skip]... -p pattern ...
Options:
-r DIR Root directory (default: .)
-s DIR Directory name to skip (can repeat)
-p PATTERN File pattern (e.g. '*.md', '*.txt') (required, can repeat)
Example:
$0 -p '*.md'
$0 -r src -s node_modules -s .git -p '*.md' -p '*.txt'
EOF
exit 1
}
while getopts ":r:s:p:" opt; do
case "$opt" in
r) ROOT="$OPTARG" ;;
s) SKIP_DIRS+=("$OPTARG") ;;
p) PATTERNS+=("$OPTARG") ;;
*) usage ;;
esac
done
shift $((OPTIND - 1))
# Require at least one pattern
(( ${#PATTERNS[@]} > 0 )) || usage
# Build prune expression
PRUNE_EXPR=()
if (( ${#SKIP_DIRS[@]} > 0 )); then
PRUNE_EXPR+=( \( )
for i in "${!SKIP_DIRS[@]}"; do
PRUNE_EXPR+=( -type d -name "${SKIP_DIRS[$i]}" -prune )
[[ $i -lt $((${#SKIP_DIRS[@]} - 1)) ]] && PRUNE_EXPR+=( -o )
done
PRUNE_EXPR+=( \) -o )
fi
# Build pattern expression
PATTERN_EXPR=( \( )
for i in "${!PATTERNS[@]}"; do
PATTERN_EXPR+=( -name "${PATTERNS[$i]}" )
[[ $i -lt $((${#PATTERNS[@]} - 1)) ]] && PATTERN_EXPR+=( -o )
done
PATTERN_EXPR+=( \) )
# Execute
find "$ROOT" \
"${PRUNE_EXPR[@]}" \
-type f \
"${PATTERN_EXPR[@]}" \
-print0 |
while IFS= read -r -d '' file; do
printf "\n===== %s =====\n" "$file"
cat "$file"
done