I've written a script to aid in creating new watchfaces for the awesome [AsteroidOS](https://asteroidos.org/#) project.  A [watchface](https://github.com/AsteroidOS/unofficial-watchfaces) there typically consists of directory structure like this:
```
digital-shifted/
└── usr
    └── share
        ├── asteroid-launcher
        │   ├── watchface-img
        │   │   ├── asteroid-logo.svg
        │   │   ├── digital-shifted-0.png
        │   │   ├── digital-shifted-1.png
        │   │   ├── digital-shifted-2.png
        │   │   ├── digital-shifted-3.png
        │   │   ├── digital-shifted-4.png
        │   │   ├── digital-shifted-5.png
        │   │   ├── digital-shifted-6.png
        │   │   ├── digital-shifted-7.png
        │   │   ├── digital-shifted-8.png
        │   │   ├── digital-shifted-9.png
        │   │   └── digital-shifted-ring.svg
        │   └── watchfaces
        │       └── digital-shifted.qml
        └── fonts
            ├── OpenSans-CondLight.ttf
            └── OpenSans-Light.ttf
```
If we want to clone this watchface, named `digital-shifted` to a new watchface, let's say `digital-swirl` we need to copy that complete directory tree, but everywhere `digital-shifted` appears in a file name, we need to change it to `digital-swirl` and finally, the lines within the QML file that refers to those files should also be changed to refer to the renamed files.  This is a fairly common operation for creating a new watchface from an existing one, so this script is intended to perform that task.  It must be invoked in the same top-level directory that contains `digital-shifted` and the new `digital-swirl` must not already exist.  The copying is fairly straightforward, but then `find` is used and the script runs itself with a third argument which is the name of each individual file that contains the original name.  That part is not so obvious and is, in particular, the place I'd like comments and suggestions.


```
#!/bin/bash
# clone watchface changing names where required

# remember source and dest, trimming trailing / if needed
SOURCE=$(echo $1 | sed 's:/*$::')
DEST=$(echo $2 | sed 's:/*$::')

function showHelp {
    cat << EOF
./clone.sh source destination
Clone a existing "source" watchface to a new "destination" watchface.
The script copies and renames files that contain the "source" name and 
updates the watchface qml file to point to the renamed sources.

EOF
}

# the three-argument form is only intended to be used internally
if [ -f "$3" ] ; then
    if [[ "$3" == *.qml ]] ; then
        sed "s/$SOURCE/$DEST/g" "$3" > "${3//$SOURCE/$DEST}"
        rm "$3"
    else
        mv "$3" "${3//$SOURCE/$DEST}"
    fi
    exit
fi

if [ "$#" != "2" ] ; then
    showHelp
    exit
fi

if [ ! -d "$SOURCE" ] ; then
    echo "Error:  $SOURCE does not exist, exiting program"
    exit
fi

if [ -e "$DEST" ] ; then
    echo "Error:  $DEST already exists, exiting program"
    exit
fi

# copy all of the files
cp -r "${SOURCE}" "${DEST}"

# rename any file that contains the source dir name 
find "${DEST}" -type f -iname "*${SOURCE}*" -execdir "$(pwd)/cloner.sh" "${SOURCE}" "${DEST}" '{}' \;
```