95 lines
3.2 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# ------------------------------------------------------------------
# Author: ChatGPT
# Generated on: $(date '+%Y-%m-%d')
#
# This script deletes existing README files matching "* - README.md"
# and then recursively creates a table-of-contents README file in
# each directory. The file is named "Folder Name - README.md".
#
# Each README includes:
# - An author/date header.
# - A header with the folder's name.
# - An alphabetically sorted list of immediate subdirectories,
# with links to that subdirectorys own README.
# - An alphabetically sorted list of immediate files (excluding
# the generated README).
#
# It is written to handle blank spaces in file and folder names.
# ------------------------------------------------------------------
# Delete any existing README files matching "* - README.md"
find . -type f -name '* - README.md' -delete
# Set the base directory (change "." if necessary)
base_dir="."
# Recursively find every directory starting from base_dir.
find "$base_dir" -type d -print0 | while IFS= read -r -d '' dir; do
# For the top-level directory, use its actual name rather than "."
if [ "$dir" = "$base_dir" ]; then
base=$(basename "$PWD")
else
base=$(basename "$dir")
fi
# Define the path for the README file: "Folder Name - README.md"
readme="!$dir/${base} - README.md"
# Write the header into the README file, including author/date attribution.
{
echo ""
echo "# Table of Contents for ${base}"
echo ""
} > "$readme"
#########################
# Process Subdirectories
#########################
subdirs=()
# Find immediate subdirectories (depth 1) in the current directory.
while IFS= read -r -d '' subdir; do
sub_basename=$(basename "$subdir")
# Avoid adding empty names.
if [ -n "$sub_basename" ]; then
subdirs+=( "$sub_basename" )
fi
done < <(find "$dir" -mindepth 1 -maxdepth 1 -type d -print0)
if [ ${#subdirs[@]} -gt 0 ]; then
# Sort subdirectory names alphabetically.
mapfile -t sorted_subdirs < <(printf "%s\n" "${subdirs[@]}" | sort)
echo "## Subdirectories" >> "$readme"
for sub in "${sorted_subdirs[@]}"; do
# Build the line as a variable to avoid printf misinterpreting a leading dash.
line="- [[${sub}/${sub} - README]]"
printf "%s\n" "$line" >> "$readme"
done
echo "" >> "$readme"
fi
#################
# Process Files
#################
files=()
# Find immediate files (depth 1), excluding the generated README file.
while IFS= read -r -d '' file; do
fbase=$(basename "$file")
if [ -n "$fbase" ]; then
files+=( "$fbase" )
fi
done < <(find "$dir" -mindepth 1 -maxdepth 1 -type f ! -path "$readme" -print0)
if [ ${#files[@]} -gt 0 ]; then
# Sort file names alphabetically.
mapfile -t sorted_files < <(printf "%s\n" "${files[@]}" | sort)
echo "## Files" >> "$readme"
for f in "${sorted_files[@]}"; do
line="- [[${f}]]"
printf "%s\n" "$line" >> "$readme"
done
echo "" >> "$readme"
fi
done