Skip to content

Instantly share code, notes, and snippets.

@nylander
Created March 29, 2021 18:00
Show Gist options
  • Save nylander/beff8f66d3b5c30c6c3ec732688e5373 to your computer and use it in GitHub Desktop.
Save nylander/beff8f66d3b5c30c6c3ec732688e5373 to your computer and use it in GitHub Desktop.
ptemplate - set up a project file hierarchy
#!/bin/bash
# ptemplate - Create a project structure
# Usage: ptemplate myproject
# Last modified: Mon mar 29, 2021 07:55
# Sign: Johan Nylander
# Description: Create a folder structure
# and, if git is available, initilize git-
# version control. No files in folder private
# is under git control, and only the README file
# in run/ and tmp/ are under git control.
# Example;
#
# myproject
# ├── README.md
# ├── data
# │ └── README.md
# ├── doc
# │ └── README.md
# ├── .git
# │ └── ...
# ├── .gitignore
# ├── metadata
# │ └── README.md
# ├── private
# │ ├── .gitignore
# │ └── README.md
# ├── results
# │ └── README.md
# ├── run
# │ ├── .gitignore
# │ └── README.md
# ├── src
# │ └── README.md
# └── tmp
# ├── .gitignore
# └── README.md
#
# Note: Minimal error checking!
if [ $# -eq 0 ] ; then
echo "Usage: $0 myproject"
exit 0
fi
proj="$1"
projd=$(readlink -f "${proj}")
projdd=$(dirname "${projd}")
if [ -d "${proj}" ] ; then
echo "Error: Folder $proj exists."
exit 1
else
mkdir -p "${proj}"
fi
dirs=(data doc metadata private results run src tmp)
nogitdirs=(run tmp private)
now=$(date)
cat << EOF > "${proj}"/README.md
# README for ${proj}
- Modified: ${now}
- Sign: $USER
## Description
EOF
for d in "${dirs[@]}" ; do
mkdir -p "${proj}/${d}"
cp "${proj}/README.md" "${proj}/${d}/"
sed -i "1 s/$/, ${d} folder/" "${proj}/${d}/README.md"
done
if command -v git &> /dev/null ; then
echo 'private/*' > "${proj}/.gitignore"
for d in "${nogitdirs[@]}" ; do
if [ -d "${proj}/${d}" ] ; then
echo '*' > "${proj}/${d}"/.gitignore
if [ ! "${d}" == "private" ] ; then
echo '!README.md' >> "${proj}/${d}"/.gitignore
fi
fi
done
cd "${projd}" || exit
git init &> /dev/null
git add --all &> /dev/null
git commit -m "first commit" &> /dev/null
git branch -M main &> /dev/null
cd "${projdd}" || exit
fi
if command -v tree &> /dev/null ; then
tree -L 2 -a "$proj"
fi
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment