What is the best way to make Calculate SHA1 as a context menu option in Mac OS X?

  1. Open Automator
  2. Create new service
  3. Choose to receive selected Files and Folders in Finder (note: this actually won't work too well on folders...)
  4. Add action Run Shell Script, set Shell to /bin/bash and Pass input to "as arguments", and enter this script:

    for file; do
        if [[ -d "$file" ]]; then
            echo "$(basename "$file") is a directory"
        else
            cd "$(dirname "$file")"
            /usr/bin/openssl sha1 "$(basename "$file")"
        fi
    done | tr "\n" "\r"
    
  5. Add action Run Applescript, and enter this script:

    on run {input, parameters}
        tell application "System Events"
            activate
            display dialog input buttons {"OK"} default button 1
        end tell
    end run
    
  6. Save the service with a descriptive name


I took Gordon's excellent answer as a starting point and embellished it a little bit. Posting those changes here in case anyone else might find them useful. My version calculates the MD5 as well as the SHA1 hashes (in a more readable format) and will also time out after 5 minutes if you forget to click the "OK" button instead of throwing an AppleScript error.

Shell Script

    for file; do
      if [[ -d "$file" ]]; then
        echo "$(basename "$file") is a directory"
      else
        cd "$(dirname "$file")"
        echo -e "$(basename "$file")\r"
        echo -n "MD5: "
        /usr/bin/openssl md5 "$(basename "$file")" | egrep -o [a-f0-9]{32}
        echo -n "SHA1: "
        /usr/bin/openssl sha1 "$(basename "$file")" | egrep -o [a-f0-9]{40}
      fi
    done | tr "\n" "\r"

AppleScript

    on run {input, parameters}
      with timeout of 360 seconds
        tell application "System Events"
          activate
          display dialog input buttons {"OK"} default button 1 with title "Cryptographic Hashes" giving up after 300 --seconds
        end tell
      end timeout
    end run