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