AppleScript to write Finder tag from folder name

This is a weird one that came from a request on reddit.

Not really useful (to me) as intended, but I envision it could be re-worked to a FolderAction that would help tag photos. Especially if coupled with a file sorter. But incorporating the tag writing into the sorter would be much more sane.

The commented out do shell script lines were meant as a way to read existing tags and then add the folder name after them. That didn’t work out thanks to xattr -p spitting out hexadecimal instead of a plist array, which is the format used when writing the tags. WTF, Apple…

-- http://strawhousepig.net/
on run
  set _drop to {}
  set end of _drop to (choose folder)
  my do_it(_drop)
end run

on open _drop
  my do_it(_drop)
end open

on do_it(_drop)
  display dialog "WARNING: This script will overwrite ALL tags of files in or targeted from the opened folder with the name of the opened folder." with icon 0
  repeat with d in _drop
    if folder of (info for d) is true then
      set f to {}
      try
        tell application "Finder"
          set _tag to "" & name of (info for d) & ""
          set _files to (every item in d)
          repeat with f in _files
            if alias of (info for f as alias) is true then
              set f to original item of f as alias
            end if
-- 'xattr -p' will print the value for a named metadata ID. Naturally that value is printed as hexadecimal. :|
-- set f_plist to (do shell script "xattr -p com.apple.metadata:_kMDItemUserTags " & quoted form of POSIX path of (f as alias))
-- set _tag to (do shell script "echo \"" & f_plist & "\" | egrep -o \"*\"") & _tag
            set tag_plist to "" & _tag & ""
            do shell script "xattr -w com.apple.metadata:_kMDItemUserTags " & quoted form of tag_plist & " " & quoted form of (POSIX path of f)
          end repeat
        end tell
      on error _err
        display dialog _err
      end try
    end if
  end repeat
end do_it

Leave a Reply

Your email address will not be published. Required fields are marked *