Script Refactoring

Patterns for improving existing scripts — cleaner conditionals, safer loops, better error handling.

Rename a Directory + Update All References

The full pattern: rename with git, then update every file that referenced the old name.

Rename directories (preserves git history)
git mv pages/skills pages/competencies
git mv partials/skills partials/competencies
Update include paths in all files under a directory
for f in pages/competencies/*.adoc; do
    sed -i 's|partial$skills/|partial$competencies/|g' "$f"
done
Update nav.adoc references
sed -i 's|skills/|competencies/|g' nav.adoc
Update internal cross-references in partials
for f in partials/competencies/*.adoc partials/competencies/domains/*.adoc; do
    sed -i 's|pages/skills/|pages/competencies/|g; s|partial$skills/|partial$competencies/|g' "$f"
done
Verify nothing was missed
grep -rl 'skills/' docs/modules/ROOT/ | grep -v '.git'

Bulk sed Across a Directory Tree

Replace a string in all .adoc files recursively
find docs/modules/ROOT -name '*.adoc' -exec sed -i 's|old-string|new-string|g' {} +
Preview changes before applying (dry run with grep)
grep -rn 'old-string' docs/modules/ROOT/ --include='*.adoc'
Replace only in specific directories
find docs/modules/ROOT/partials/codex -name '*.adoc' -exec sed -i 's|codex/|codex-|g' {} +

Rename Files with a Pattern

Rename all PRJ-*.adoc to directory structure
for f in pages/projects/personal/PRJ-*.adoc; do
    slug=$(basename "$f" .adoc | sed 's/^PRJ-//')
    mkdir -p "pages/projects/personal/${slug}"
    git mv "$f" "pages/projects/personal/${slug}/index.adoc"
done
Rename files matching a pattern (change suffix)
for f in partials/codex/*-quick-reference.adoc; do
    git mv "$f" "$(echo "$f" | sed 's/-quick-reference/-ref/')"
done

Move Files Between Directories

Move flat files into subdirectories by category
git mv partials/codex/awk-quick-reference.adoc partials/codex/text/
git mv partials/codex/sed-quick-reference.adoc partials/codex/text/
git mv partials/codex/git-quick-reference.adoc partials/codex/git/
Move with a loop
for f in awk sed grep jq xargs find vim; do
    git mv "partials/codex/${f}-quick-reference.adoc" partials/codex/text/
done

Count Impact Before Refactoring

How many files reference the old name?
grep -rl 'old-name' docs/modules/ROOT/ --include='*.adoc' | wc -l
Show which files and line numbers
grep -rn 'old-name' docs/modules/ROOT/ --include='*.adoc'
Count by directory
grep -rl 'old-name' docs/modules/ROOT/ --include='*.adoc' | awk -F/ '{print $5}' | sort | uniq -c | sort -rn

Safe Refactoring Workflow

1. grep -rl 'old' docs/     → count impact
2. git stash                 → save current work
3. git mv old/ new/          → rename directories
4. sed -i 's|old|new|g'      → update references
5. grep -rl 'old' docs/     → verify nothing missed
6. make 2>&1 | grep ERROR   → verify build
7. git diff --stat           → review changes
8. git add -A && git commit  → commit
Always grep for the old name after sed to catch edge cases. Some references might use different quoting or line breaks that sed missed.

See Also

  • Functions — extract repeated logic into functions

  • Safe Workflows — defensive patterns for production scripts