Any chance the folders are created in sequence? I.e. is the create date of folder 2.0.1 always going to be greater than folder 1.9.8, etc?

Will the numbers always be single digits? If so, you could make a list of good named folders (testing the length of the file name and making sure it started with “folder” and ending with “#.#.#” to get rid of anything that didn’t conform), then you could sort the results and use the last one.

How about something like this. Seems a bit clunky but also seems to work… :wink:

(* Characters which are ok to match in your version numbers *)
property okCharacters : "1234567890."

(* A sample list of folder names *)
set queryList to {"abc", "Folder 4.9.2", "Folder 4.9.2a", "Folder 4.0.1", "Folder 4.2.8", "Folder 4.8.7", "Folder 4.0Beta", "flibr-djibit"}

set maxVersion to 0
repeat with tmpQuery in queryList
	if tmpQuery begins with "Folder " then
		set tmpVersion to (text items 8 through -1 of (tmpQuery as string)) as string
		if (validateString(tmpVersion) is true) and (tmpVersion > maxVersion) then
			set maxVersion to tmpVersion
		end if
	end if
end repeat
return (maxVersion as string)

(* A subroutine to check if all the characters in the version are ok *)
to validateString(tmpVersion)
	set tmpChars to (characters of tmpVersion) as list
	set charsOK to true
	repeat with tmpChar in tmpChars
		if okCharacters does not contain tmpChar then
			set charsOK to false
		end if
	end repeat
	return charsOK
end validateString


that’s an interesting approach jobu, works good too. thanks!

If your folders’ version numbers are definitely only groups of single digits, and only folders are so named, you might get away with this:

set mySubPath to (path to current user folder as Unicode text) & "Folder:Subfolder:"

do shell script "find " & (POSIX path of mySubPath) & " -name "Folder [0-9].[0-9].[0-9]""
set targetPath to (last paragraph of result) as POSIX file as Unicode text

tell application "Finder"
  set theTarget to folder targetPath
end tell

It appears to sort correctly. Another possibility, if it’s of any interest, is to use my “FinderSort()” handler, which is here in ScriptBuilders. This will correctly sort even folders with double-digit version strings such as “4.8.10”. It’s actually two quite large handlers, but you don’t need its text in your script. You can simply load it as a library. Then your script might be:

set FS to (load script file ((path to scripts folder as Unicode text) & "Libraries:FinderSort().scpt")) -- your own path here
set OKchars to "1234567890."

tell application "Finder"
  set mySub to folder "Folder:Subfolder:" of home
  -- Get a reference to the likeliest subfolders.
  set fRef to a reference to (folders of mySub whose name begins with "Folder " and ¬
    name extension is in {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"})

  -- Sort the folders by name.
  set sortedFolders to FS's FinderSort(fRef, "name")
  -- Check through from the end of the sorted list.
  -- Accept the first folder whose name has no rogue characters.
  set OK to false
  considering case
    repeat with i from (count sortedFolders) to 1 by -1
      set theTarget to item i of sortedFolders
      set n to name of theTarget
      repeat with j from 8 to (count n)
        set OK to (character j of n is in OKchars)
        if (not OK) then exit repeat
      end repeat
      if (OK) then exit repeat
    end repeat
  end considering
  if (not OK) then error "No suitable folder was found."
end tell

Nigel, this is an awesome little utility. great job! i wish i could use it in this application but this will need to be run on thousands of machines from a CDROM so it’s not practical for that. but it’s awesome and i’m going to get a lot of use out of it on my own machine. thanks!

Another way is to “feel” your way towards the lastest version folder name using nested repeats to generate the numbers:

tell application "Finder"
  set parentFolder to folder "Folder:Subfolder:" of home
  set folderNames to name of folders of parentFolder whose name begins with "Folder "
  set latestName to my latestVersionFolderName(folderNames)
  set theTarget to folder latestName of parentFolder
end tell

on latestVersionFolderName(folderNames)
  set baseName to "Folder 4."
  considering case -- for faster string comparisons
    repeat with v2 from 9 to 0 by -1
      repeat with v3 from 9 to 0 by -1
        set thisName to baseName & v2 & "." & v3 -- automatic number-to-string coercions
        if (thisName is in folderNames) then return thisName
      end repeat
    end repeat
  end considering
end latestVersionFolderName

This will handle “double figures” if you make the repeats loop from 15 to 0 rather than from 9 to 0. You could also, if you liked, add an outer ‘v1’ loop in the handler to supply the “major” version number. You’d then have to adjust ‘basename’ and the ‘set thisName…’ line.