keep newest file of two almost same files

Hi all,

Newbie on this, but with googling and trying I came quite far. This last bit I cannot really figure out.

So finally I have a folder with loads of files named something like this:
Book1-001-a
Book1-001-b
Book1-044-a
Book1-100-b
Book1-132-a
Book1-132-b

Where the number is the pagenumber.
If there are two files with the same pagenumber (001 and 132 in this case), I need to delete the oldest of the two.

I know I need to check if there are two files with the same pagenumber and then to get the mod-dates, but I can’t figure out how to do that.

Could somebody point me in the right direction?
Thank you very much in advance.

Welcome to MacScripter.

This is a quick job of it and I only tested on one test folder with the specific names you gave, so please test some more for possible bugs before you go off and delete a ton of critical files.


use AppleScript version "2.4" -- Yosemite (10.10) or later
use scripting additions

tell application "Finder"
	set bookPagesFolder to choose folder
	set bookFiles to every item of bookPagesFolder
	set bookFileNames to the name of every item of bookPagesFolder
	set truncatedFileNames to {}
	
	set {delimitHolder, AppleScript's text item delimiters} to {AppleScript's text item delimiters, "-"}
	repeat with aFileName in bookFileNames
		set truncatedName to text item 1 of aFileName & "-" & text item 2 of aFileName
		set truncatedFileNames to truncatedFileNames & truncatedName
	end repeat
	set AppleScript's text item delimiters to delimitHolder
	set fileCount to the count of bookFiles
	set deleteItems to {}
	set checkedNames to {}
	repeat with i from 1 to fileCount - 1
		set currentFile to item i of bookFiles
		set currentTruncatedName to item i of truncatedFileNames
		if currentTruncatedName is not in checkedNames then
			set checkedNames to checkedNames & currentTruncatedName
			set fileOccurances to my list_positions(truncatedFileNames, currentTruncatedName, true)
			if (count of fileOccurances) ≠ 1 then -- you should always get one hit for the item itself
				set modDates to {}
				repeat with j in fileOccurances
					set modDates to modDates & the modification date of item j of bookFiles
				end repeat
				set latestDate to item -1 of my simple_sort(modDates)
				repeat with k in fileOccurances
					if the modification date of item k of bookFiles is not latestDate then set deleteItems to deleteItems & k
				end repeat
			end if
		end if
	end repeat
	repeat with l in deleteItems
		delete item l of bookFiles
	end repeat
end tell


on simple_sort(my_list)
	set the index_list to {}
	set the sorted_list to {}
	repeat (the number of items in my_list) times
		set the low_item to ""
		repeat with i from 1 to (number of items in my_list)
			if i is not in the index_list then
				set this_item to item i of my_list
				if the low_item is "" then
					set the low_item to this_item
					set the low_item_index to i
				else if this_item comes before the low_item then
					set the low_item to this_item
					set the low_item_index to i
				end if
			end if
		end repeat
		set the end of sorted_list to the low_item
		set the end of the index_list to the low_item_index
	end repeat
	return the sorted_list
end simple_sort


on list_positions(thisList, thisItem, listAll)
	set the offsetList to {}
	repeat with i from 1 to the count of thisList
		if item i of thisList is thisItem then
			set the end of the offsetList to i
			if listAll is false then return item 1 of offsetList
		end if
	end repeat
	if listAll is false and offsetList is {} then return 0
	return the offsetList
end list_positions

Note that the way I wrote this, if the modification dates of files are changing while the script is running, it could delete all the copies of that file. (It deletes all copies whose modification date is not the most recent - if it finds the most recent date, then the date on that file changes before it gets to deleting, it will delete all copies.) Seems unlikely you’ll be saving the relevant files it’s operating on during that microsecond, but thought I’d mention it.

Thank you t.spoon… for the welcome and very much for your effort.

I quickly tested it and it works !
I’ll now integrate it in the bigger script and see if the complete thing does what it needs to do :slight_smile:

Thanks !