#!/usr/bin/env bash # This script is intended to be run via cron. But you can run it manually as # well # It creates a folder structure in home for the current date in the following format: # //// # It also sets up a symlink for the tagged folder. # This symlink will always point to the folder for the current date. # Finally, it removes any folders without data, to prevent clutter. set -e function errorFn { error=$? if [[ $error -gt 0 ]]; then echo "$LD_BIN error ($error): " perl -E 'say $!=shift' $error fi exit $error } # Error handling trap errorFn ERR # Source LD LD_INTERNAL=1 . $(dirname $(realpath $0))/ld.source if [[ $1 == '' ]]; then echo "Usage: $LD_BIN " echo "Creates a folder within '.daisy' in the current directory containing" echo "a tree of dates associated with the folder name given by argument." echo "A symlink is (re-)created at the same time with the same folder name." echo "For example, if given the folder 'notes', this utility will:" echo "- Create a folder '/.daisy/notes///'." echo "- Create a symlink named 'notes' that points to it." echo "It is recommended to run this via cron." exit 1 fi view=0 view_date=0 if [[ "$1" == "--view" ]]; then # We are only going to view the agenda view_date=$2 view=1 shift 2 fi dir=$(realpath -s "$1") parent_dir=$(dirname "$dir") name=$(basename "$dir") root_dir="$parent_dir/.daisy/$name" today_sym="$dir" # Present day read year month day < <(date "+%Y %m %d") today="$root_dir/$year/$month/$day" # First we clear out empty folders, and remove the symlink if it exists if test -e "$root_dir"; then find "$root_dir" -name "More..." -delete find "$root_dir" -depth -maxdepth 3 -type d \ -not -path "$today" \ -exec sh -c ' if [ $(ls -A "$1" | wc -l) -eq 0 ]; then rm -rf "$1" fi ' _ {} \; fi if [[ $view == 1 ]]; then # View mode [[ ! -d "$root_dir/$view_date" ]] && echo "This date entry does not exist." && exit 1 view_date="$root_dir/$view_date" # 1. -name "*.squashfs" -prune: If a folder ends in .squashfs, don't descend into it. # 2. ! -name "*.squashfs": Inside the directory check, ignore squashfs files. # 3. --ignore="*.squashfs": Tells ls to hide those entries from the final list. find "$(realpath "$view_date")" -name "*.squashfs" -prune -o -type d -exec sh -c ' find "$1" -maxdepth 1 -type f ! -name "*.squashfs" | read -r ' _ {} \; -exec ls --color=always -lah --ignore="*.squashfs" {} + 2>/dev/null exit 0 fi # Now we can set up today's directory mkdir -p "$today" ln -snf "$today" "$today_sym" ln -snf "$root_dir" "$dir/More..." exitcode=$?