I tell my NSS students often that software developers, at their core, are really lazy. In fact, we'll spend immeasureable hours coding a solution that will allow us to avoid a manual task that the solution replaces.
Case in point - for my front end curriculum, I number the directories in my git repo.
...
17-javascript-103
18-modern-tools-101
19-css-201
...
Unfortunately, this causes an issue when I want to inject a new module at, oh say, 21. When there are 44 modules, that means I would have to manually rename all modules from 21-44 in order to make my new one fit in the naming convention. Well, since I'm lazy and don't want to do that, I spent a few hours tonight playing around writing a bash script that will automate that process for me.
Yes, I could have manually renamed all those directories in a manner of minutes, but what if I needed to do it again in 10 minutes, and then again tomorrow, etc?
Here you go. My amateur bash solution.
#!/bin/bash
STARTDIR=$1
for directory in `ls -d */`
do
dir=$(basename "$directory")
pattern=([0-9][0-9])-[0-9a-zA-z-]+ # The RegEx pattern to match
if [[ $dir =~ $pattern ]] ; then # See if it matches
currentModuleNumber="10#${BASH_REMATCH[1]}"; # Get the module number (base 10)
if [[ $currentModuleNumber -ge $STARTDIR ]] ; then # Only start renumbering
# when the module number is >=
# the parameter value
newPrefix="00$(($currentModuleNumber + 1))" # Increase the module number
trimmed=${newPrefix:(-2)}; # Pad any numbers less than 10 with a 0
mv $dir "$trimmed$(echo $dir | sed -e 's/^..//')"; # Rename the directory
fi
else
echo "${BASH_REMATCH[0]} did not match";
fi
done