pantheon/bin/consolidate
2025-02-06 19:22:48 +08:00

107 lines
No EOL
3 KiB
Bash
Executable file

#!/bin/bash
# Function to get the list of extensions from the arguments passed to the script
get_extensions() {
# Check for input:
# If the user provides any arguments, store those as the list of file extensions to look for.
# If no arguments are given, leave extensions array empty to let the regex pattern search for everything.
if [ $# -gt 0 ]; then
EXTENSIONS=()
for var in $@
do
# Strip the . from the given extension if user gives the extension with a period (like .md)
var=${var/"."/}
EXTENSIONS+=("${var}")
done
else
EXTENSIONS=()
fi
}
# Function to get the current date in YYYY-MM-DD format
get_current_date() {
date +%F
}
# Function to ignore files based on .gitignore
is_ignored() {
local filepath="$1"
git check-ignore -q "$filepath" # Returns 0 if ignored, 1 otherwise
return $?
}
# Function to process a single file
process_file() {
local filepath="$1"
local header="# $filepath"
{
echo "$header"
echo "" # Print a blank line
cat "$filepath"
echo "" # Print a blank line after file content
} >> "$output_file"
}
# Function to traverse directories recursively
traverse_directory() {
local dir="$1"
# The regex pattern starts with '.*', which searches for any matching characters
# '.' is a wildcard, while '*' means match as many occurrences of the preceding char
# '\.' escapes the '.' special char to search for the actual char
# () is a capturing group. The | character is an OR operator
# '$' indicates the preceding string should be followed by the end of line
if [ ${#EXTENSIONS[@]} -gt 0 ]; then
EXTENSIONS_PATTERN=$(printf '\\|%s' "${EXTENSIONS[@]}")
pattern=".*\.\($EXTENSIONS_PATTERN\)$"
else
pattern=".*$"
fi
# Loop through each item in the directory
for entry in "$dir"/*; do
# Check if entry exists (handles empty directories)
if [[ -e "$entry" ]]; then
if [[ -d "$entry" ]]; then
# Check if the directory is .git
if [[ "$(basename "$entry")" != ".git" ]]; then
# Recursively traverse the directory
traverse_directory "$entry"
fi
elif [[ -f "$entry" ]]; then
# Ignore .gitignore files and files in .gitignore
if [[ "$(basename "$entry")" != ".gitignore" ]] &&
! is_ignored "$entry" &&
[[ "$entry" =~ $pattern ]]; then # Check against regex pattern
process_file "$entry"
fi
fi
fi
done
}
# Main function
main() {
get_extensions
output_file="output-$(get_current_date).txt"
# Clear previous output file (if exists)
> "$output_file"
# Start traversing from the current directory
traverse_directory "."
echo "Consolidation complete! Output saved in: $output_file"
}
# Start the process.
echo "Consolidating..."
# Execute main function
main
# Complete the process:
# Inform the user that the operation is complete and let them know where the consolidated output has been saved.
echo "Consolidation complete! See your output file at: "