You can use in your Hazel conditions to match downloaded or Cloud-only files. For example, to only match files that are present locally I use this condition:
- Code: Select all
Passes shell script → Embedded Script → /path/to/onedrive.sh is_downloaded "$1"
All usages:
- onedrive.sh is_downloaded: to check if the file is present locally
- onedrive.sh is_online: to check if the file is Cloud-only
- onedrive.sh pin: ask OneDrive to keep a copy locally
- onedrive.sh unpin: ask OneDrive to not keep a copy locally (only a preview)
The onedrive.sh script:
- Code: Select all
#!/usr/bin/env bash
DELAY="1,1,2,3,5,8"
CMD=$1
FILE=$2
function print_usage() {
echo "usage: $0 (pin|unpin|is_downloaded|is_online) /path/to/file" >&2
exit -1
}
if [[ $# != 2 || ! -f "$FILE" ]]; then
print_usage
fi
if [[ "$CMD" == "is_downloaded" ]]; then
$(/usr/bin/fileproviderctl evaluate "$FILE" | grep -q "isDownloaded = 1")
exit $?
fi
if [[ "$CMD" == "is_online" ]]; then
$(/usr/bin/fileproviderctl evaluate "$FILE" | grep -q "isDownloaded = 0")
exit $?
fi
if [[ "$CMD" == "pin" ]]; then
/Applications/OneDrive.app/Contents/MacOS/OneDrive /pin "$FILE"
/opt/homebrew/bin/retry --delay "$DELAY" --times 5 "$0" is_downloaded "$FILE"
exit $?
fi
if [[ "$CMD" == "unpin" ]]; then
/Applications/OneDrive.app/Contents/MacOS/OneDrive /unpin "$FILE"
/opt/homebrew/bin/retry --delay "$DELAY" --times 5 "$0" is_online "$FILE"
exit $?
fi
print_usage
I see now that it uses /opt/homebrew/bin/retry (brew install retry) for when operations don't succeed at first. Feel free to remove those lines if you don't want to have retries.