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}" '{}' \; ```