#!/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: "