10.6: Rename screenshots with Automator and AppleScript

Dec 07, '09 07:30:03AM

Contributed by: tangawk

Snow Leopard only hintScreen capture on Mac OS is a fantastic way to take information around with you on a mobile phone. Of course, if capturing many different items, you need to label them. This hint shows how to use Automator and AppleScript to make this a one click process.

First, build an Automator workflow (choose Application from the template chooser) as follows:

  1. Finder » Find Finder Items: Search Desktop for Name -- begins with -- Screen Shot
  2. Finder » Rename Finder Items: Set this to Make Sequential, then set it to create a new name (Picture), with Place Number 'after name' and Start Numbers At set to '1'.
  3. Utilities » Run Applescript: Replace all the editable script with the script below, including the run as, etc.
    on run
      
      (*
    Replace Text In Item Names
    
    This script is designed to replace text in the names of specific files and/or folders in the front window of the desktop. 
    If no folder windows are open, the script will affect files and/or folders on the desktop.
    
    Copyright © 2001–2007 Apple Inc.
    
    You may incorporate this Apple sample code into your program(s) without
    restriction.  This Apple sample code has been provided "AS IS" and the
    responsibility for its operation is yours.  You are not permitted to
    redistribute this Apple sample code as "Apple sample code" after having
    made changes.  If you're going to redistribute the code, we require
    that you make it clear that the code was descended from Apple sample
    code, but that you've made changes.
    *)
      
      --set the source_folder to choose folder with prompt "Folder containing items to edit:"
      
      -- get the path to the folder of the front window
      -- if no windows are open, the desktop folder will be used
      try
        tell application "Finder" to set the source_folder to (folder of the front window) as alias
      on error -- no open folder windows
        set the source_folder to path to desktop folder as alias
      end try
      
      set the search_parameter to "File Names"
      
      -- display dialog "Replacing Picture  with your text in File names:" buttons {"Cancel", "OK"} default button 2
      set the search_string to the "Picture"
      
      
      repeat
        display dialog "Enter replacement text:" default answer "" buttons {"Cancel", "OK"} default button 2
        set the replacement_string to the text returned of the result
        if the replacement_string contains ":" then
          beep
          display dialog "A file or folder name cannot contain a colon (:)." buttons {"Cancel", "OK"} default button 2
        else if the replacement_string contains "/" then
          beep
          display dialog "A file or folder name cannot contain a forward slash (/)." buttons {"Cancel", "OK"} default button 2
        else
          exit repeat
        end if
      end repeat
      
      display dialog "Replace “" & the search_string & "” with “" & the replacement_string & "” in every item name?" buttons {"Cancel", "OK"} default button 2
      
      set the item_list to list folder source_folder without invisibles
      set source_folder to source_folder as string
      repeat with i from 1 to count of the item_list
        set this_item to item i of the item_list
        set this_item to (source_folder & this_item) as alias
        set this_info to info for this_item
        set the current_name to the name of this_info
        set change_flag to false
        if the current_name contains the search_string then
          if the search_parameter is "Folder Names" and ¬
            folder of this_info is true then
            set the change_flag to true
          else if the search_parameter is "File Names" and ¬
            folder of this_info is false then
            set the change_flag to true
          else if the search_parameter is "Both" then
            set the change_flag to true
          end if
          if the change_flag is true then
            -- replace target string using delimiters
            set AppleScript's text item delimiters to the search_string
            set the text_item_list to every text item of the current_name
            set AppleScript's text item delimiters to the replacement_string
            set the new_item_name to the text_item_list as string
            set AppleScript's text item delimiters to ""
            my set_item_name(this_item, new_item_name)
          end if
        end if
      end repeat
      
      beep 2
    end run
    
    on set_item_name(this_item, new_item_name)
      tell application "Finder"
        --activate
        set the parent_container_path to (the container of this_item) as text
        if not (exists item (the parent_container_path & new_item_name)) then
          try
            set the name of this_item to new_item_name
          on error the error_message number the error_number
            if the error_number is -59 then
              set the error_message to "This name contains improper characters, such as a colon (:)."
            else --the suggested name is too long
              set the error_message to error_message -- "The name is more than 31 characters long."
            end if
            --beep
            tell me to display dialog the error_message default answer new_item_name buttons {"Cancel", "Skip", "OK"} default button 3
            copy the result as list to {new_item_name, button_pressed}
            if the button_pressed is "Skip" then return 0
            my set_item_name(this_item, new_item_name)
          end try
        else --the name already exists
          --beep
          tell me to display dialog "This name is already taken, please rename." default answer new_item_name buttons {"Cancel", "Skip", "OK"} default button 3
          copy the result as list to {new_item_name, button_pressed}
          if the button_pressed is "Skip" then return 0
          my set_item_name(this_item, new_item_name)
        end if
      end tell
    end set_item_name
  4. Save the workflow as an application.
Now when you screen grab anything which appears as Screen shot xxxxx on the Desktop, just double-click the application you created. You will be asked for a name which will become the prefix for each file, and multiple files will be suffixed with a number in time sequence. I stuck my application in the Toolbar of my Finder window.

Details:

You will note that the process is a bit cumbersome -- Automator first renames files to Picture..., then the script asks you for what you want to replace Picture... with. This is just customized from Apple's own Finder script. The latter used to work fine on its own pre-Leopard, when files were prefixed just with Picture....

The cleverest part of getting this to work is not mine. I had to edit the script because, in Automator, the number of items in command kept giving an error (No result was returned from some part of this expression). I needed to replace this with count as I read in this forum post.

OK that's all to read. Hope it saves somebody lots of paper like it did me!

[robg adds: I tested this, and it worked, but only if I set the search scope in the first command to Desktop. When set to Computer, it didn't seem to work. Also, if Automator would simply let you place a variable into the "New Name" field in the "Make Sequential" step, the entire AppleScript could be avoided. Alas, I couldn't find any way to do that.]

Comments (15)


Mac OS X Hints
http://hints.macworld.com/article.php?story=20091123195307839