Multiple if conditions within nested repeat while in applescript - applescript

I've never used AppleScript before, so i'm quite unfamiliar with the language, but i'm doing my best.
Here's what i'm trying to accomplish:
Run a script while selecting a folder filled with .ARW and .JPG files. Iterate through the items in the folder. If the current item is .ARW, iterate through the folder starting from the beginning again. If this nested iteration lands on a file that has the same file name and a JPG extension, label the original ARW file with red.
TLDR: If an ARW file in a folder shares the same filename as a JPG file in the folder, highlight the ARW file in red, otherwise do nothing.
Here's the code i've written so far:
tell application "Finder"
set totalAlias to the entire contents of (selection as alias)
set totalCount to the count of items of totalAlias
set firstName to name of item 1 of totalAlias
set firstExtension to name extension of item 1 of totalAlias
set c to 1
repeat while c ≤ totalCount
set currentAlias to item c of totalAlias
set currentName to name of currentAlias
set currentExtension to name extension of currentAlias
if currentExtension is "ARW" then
set d to 1
set compareFile to currentAlias
set findName to currentName
set findExtension to currentExtension
repeat while d ≤ totalCount
if (name of item d of totalAlias = findName) and (name extension of item d of totalAlias is "JPG") then
tell application "Finder" to set label index of compareFile to 2
end if
set d to (d + 1)
end repeat
end if
set c to (c + 1)
end repeat
end tell
Any thoughts on what's going wrong? I believe it has to do with my IF AND condition.

Try this script:
tell application "Finder"
--Just get all the filenames of the target types:
set allJPG to the name of every file of (entire contents of (selection as alias)) whose name extension = "JPG"
set allARW to the name of every file of (entire contents of (selection as alias)) whose name extension = "ARW"
--Send the two lists to a handler to find all the common names
set targetJPGFiles to my CompareNames(allJPG, allARW)
--Loop through the common names, find the files, set the tags
repeat with eachTarget in targetJPGFiles
set fileToTag to (item 1 of (get every file of (entire contents of (selection as alias)) whose name is (eachTarget as text)))
set label index of fileToTag to 2
end repeat
end tell
targetJPGFiles -- This allows you to see the filenames that SHOULD have been tagged
to CompareNames(jp, pn)
--First, get rid of all the extensions in the ARW files
set cleanARWNames to {}
set neededJPGNames to {}
repeat with eachARWName in pn
set end of cleanARWNames to characters 1 thru -5 of (eachARWName as text) as text
end repeat
--Now, loop through JPG names to find a match
repeat with eachjpgName in jp
set searchName to characters 1 thru -5 of (eachjpgName as text) as text
if cleanARWNames contains searchName then
set end of neededJPGNames to (eachjpgName as text)
end if
end repeat
return neededJPGNames
end CompareNames
It takes a slightly different approach, in that it just compares two lists of filenames only, then goes back, finds the files with the names you want, and does the tagging.
It is based on a script I wrote for another project, so I hope it works for you.
I have never used the label index property in Finder before, and I found through some testing that I could not see the labels until I clicked on the folder after the script ran. All the target files had the correct tag after I did that, though.

Related

Is there an AppleScript I can write to remove the first instance of a character in a file name?

In the image below, I am trying to edit every file name in the cat directory so it only contains one "." For example, I need the first file name to be cat1.jpg and so forth for all of the other file names.
Do any of you all mind providing me some guidance on how I can implement an AppleScript (with Automator?) to rename all of the files in this cat directory?
Let's assume that all the files you want to rename are in a folder on your desktop named "Cat"
This following AppleScript code will remove the first instance of "." ... Leaving an empty space in its place. So, "cat.1.jpg" will be renamed to "cat 1.jpg" etc.
property theFolder : ((path to desktop) as text) & "Cat"
property originalFileName : missing value
property originalFileNameExtension : missing value
tell application "Finder" to set theFiles to (files of folder theFolder) as alias list
repeat with i from 1 to count of theFiles
set thisItem to item i of theFiles
tell application "System Events"
set fileInfo to thisItem's properties
set {originalFileName, originalFileNameExtension} to ¬
{name of fileInfo, name extension of fileInfo}
end tell
set theOffset to offset of originalFileNameExtension in originalFileName
set shortName to text 1 thru (theOffset - 2) of originalFileName
set text item delimiters to "."
set tempText to every text item of shortName
set text item delimiters to " "
set cleanedName to (tempText as text) & "." & originalFileNameExtension
tell application "System Events" to set name of thisItem to cleanedName
end repeat
This would be a full AppleScript solution to your question. But if this is only a one time event for you, mass renaming of the files through Finder, would be a quicker solution.
Answering the question in the title, once you cycle through strings in a repeat loop, to remove the first instance of a string from a string you can:
Use offset:
set s to "foo.bar.txt"
set o to offset of "." in s
set r to (text 1 thru (o - 1) of s) & (text (o + 1) thru -1 of s)
Use Applescript's Text Item Delimiters:
set AppleScript's text item delimiters to "."
set l to text items of s
set r to (item 1 of l) & (text items 2 thru -1 of l as string)
set AppleScript's text item delimiters to ""

Sorting files into new folders based on first number using Applescript

I'm trying to make a folder that will automatically create folders then sort the files into them based on the first number. The files I have to sort all come in a similar format with a name like,Feb 4 2.3 U#03 (3).mrd. My intention was to write some AppleScript to create a folder based on the number (2.3) then put all the files with (2.3) into that folder, and do the same with all the other files.
I made a bit that sorts the files based on their number that seems to work,
set text item delimiters to {" "}
tell application "Finder"
set aList to every file in folder "Re-namer"
repeat with i from 1 to number of items in aList
set aFile to (item i of aList)
try
set fileName to name of aFile
set firstPart to text item 1 of fileName
set secondPart to text item 2 of fileName
set thirdPart to text item 3 of fileName
set fourthPart to text item 4 of fileName
set fifthPart to text item 5 of fileName
set newName to thirdPart & " " & secondPart & " " & firstPart & " " & fourthPart & " " & fifthPart
set name of aFile to newName
end try
end repeat
end tell
now I just need to create the new folders based on the first number and put the matching files in. I tried to make a script for this too (keep in mind I've never coded before and have no idea what I'm doing) and unsurprisingly it didn't work :(
tell application "Finder"
open folder "Re-namer"
set loc to folder "Re-namer"
set aList to every file in loc
repeat with i from 1 to number of items in aList
set aFile to (item i of aList)
if not (exists folder named "text item 1" in loc) then
make new folder in loc with properties {name:"text item 1"}
else
move aFile in folder "text item 1"
end if
end repeat
end tell
I've found a few similar questions but I still can't get it to work. If anyone has any ideas or resoures to help with this question I would greatly appreaate it.
Your are very close to correct script. However, instead of doing 2 loops, one for changing names and one to move files, it is quicker to do only 1 loop doing both at same time.
Also, the key thing is to understand that, in the loop, if you change the name, the Finder loose the reference to the file changed, then it fails when you try to move it after changing name. but since you know the folder and the new name, you can still reference to that "new" file.
set MyRenamer to choose folder "Select the folder"
set TPath to MyRenamer as string
set text item delimiters to {" "}
tell application "Finder"
set aList to every file in MyRenamer
repeat with F in aList
set fileName to name of F
set firstPart to text item 1 of fileName -- like "Feb"
set secondPart to text item 2 of fileName -- like "4"
set thirdPart to text item 3 of fileName -- like "2.3"
set fourthPart to text item 4 of fileName -- like "U#03"
set fifthPart to text item 5 of fileName -- like "(3).mrd"
set newName to thirdPart & " " & secondPart & " " & firstPart & " " & fourthPart & " " & fifthPart
set name of F to newName
if (not (exists folder thirdPart in MyRenamer)) then
make new folder in MyRenamer with properties {name:thirdPart}
end if
move (TPath & newName) as alias to folder (TPath & thirdPart & ":") -- rebuild the new file path as alias and move it.
end repeat
end tell
Tested and OK.

Using AppleScript to compare filenames without extensions in two directories

To preface, I made a Photoshop batch action which converts a folder with thousands of images in different formats into .pngs. Unfortunately some of them were skipped and others converted with the wrong aspect ratio.
I'm hoping to compare the folders using Applescript. At the moment I just want to find which files made it through and which didn't. I'd like the user to be able to select the source and converted folders, and then need to strip the file extension to compare the filenames in each folder. Here's what I have written so far; it seems to stop right after the end tell statement. What am I doing wrong?
--Set folder paths
display dialog "Choose the source folder containing images with correct aspect ratios"
set source_folder to (choose folder)
display dialog "Choose the folder containing PNGs to compare to"
set png_folder to (choose folder)
--Create lists of folder contents for each folder
tell application "System Events"
set source_filenames to name of every file of source_folder
set source_extensions to name extension of every file of source_folder
set png_filenames to name of every file of png_folder
set png_extensions to name extension of every file of png_folder
end tell
--Collect names (filename minus dot and extension)
set source_names to {}
repeat with n from 1 to count of source_filenames
set source_filename to item n of source_filenames
set source_extension to item n of source_extensions
if source_extension is not "" then
set source_filename_length to (count of source_filename) - (count of source_extension) - 1
set end of source_names to text 1 thru source_filename_length of source_filename
else
set end of source_names to source_filename
end if
end repeat
return source_names
set png_names to {}
repeat with n from 1 to count of png_filenames
set png_filename to item n of png_filenames
set png_extension to item n of png_extensions
if png_extension is not "" then
set png_filename_length to (count of png_filename) - (count of png_extension) - 1
set end of png_names to text 1 thru png_filename_length of png_filename
else
set end of png_names to png_filename
end if
end repeat
return png_names
--Compare each item of source folder to png folder
repeat with n from 1 to the count of source_names
set theFile to (item n of source_names)
if theFile is in png_names then
log "Match found for file " & theFile
set foundFile to true
else
log "No match found for file " & theFile
set foundFile to false
end if
end repeat
Later, I'll want to compare aspect ratios (using this thread as a guide http://macscripter.net/viewtopic.php?id=38308) and have all the files which either didn't get converted or were converted with the incorrect aspect ratio put into some sort of list.
Thanks for your help! :)
Solved it myself! Shouldn't be returning source_names/png_names.

applescript to create multiple sequentially numbered folders with a specific prefix

I would like to create an applescript that will create multiple folders with the same root name but the numbers change? or at least a repeating folder creation script until the person has enough folders. So something that makes folders like this: JOYR-15-0035-00, JOYR-15-0036-00, JOYR-15-0037-00 and so on. Is that at all possible? I am just learning this. I am normally a graphic designer but I feel like I can get a lot from applescript.
Currently I just have this basic script:
tell application "Finder"
set KDID to text returned of (display dialog "Enter the KDID ID:" default answer "JOYR-")
set loc to choose folder "Choose Parent Folder Location"
set newfoldername to {name:KDID}
set newfo to make new folder at loc with properties {name:KDID}
reveal newfo
end tell
Try this, it assumes that the KDID is just the number 15 in the example, the syntax is always JOYR-<KDID>-<consecutive number>-00 and the leading JOYR as well as the trailing double zero don't change.
The script asks for the parent folder, the KDID and the number of sequential folders. Then it checks the parent folder for the greatest existing number (the 0035 part) and creates folders starting with the greatest number plus 1 or – if no existing folders are found – with 1. The number has always four digits.
property letterPrefix : "JOYR"
property KDID : "15"
property parentFolder : missing value
set parentFolder to choose folder "Choose Parent Folder Location"
tell application "Finder"
activate
set KDID to text returned of (display dialog "Enter the KDID ID:" default answer "15")
repeat
set howManyFolders to text returned of (display dialog "Enter the Number of Folders to create:" default answer "1")
try
set howManyFolders to howManyFolders as integer
if howManyFolders < 1 then error
exit repeat
on error
display dialog "Please enter an integer value greater than 0" default answer "1"
end try
end repeat
set currentNumber to my getGreatestFolderNumber()
repeat howManyFolders times
set folderName to letterPrefix & "-" & KDID & "-" & my pad(currentNumber) & "-00"
make new folder at parentFolder with properties {name:folderName}
set currentNumber to currentNumber + 1
end repeat
open parentFolder
end tell
on getGreatestFolderNumber()
tell application "Finder"
set {ASTID, AppleScript's text item delimiters} to {AppleScript's text item delimiters, "-"}
try
set folderNames to name of folders of parentFolder whose name starts with (letterPrefix & "-" & KDID & "-")
set maxNumber to 0
repeat with aName in folderNames
set curNumber to (text item 3 of aName) as integer
if curNumber > maxNumber then set maxNumber to curNumber
end repeat
set AppleScript's text item delimiters to ASTID
return maxNumber + 1
on error
set AppleScript's text item delimiters to ASTID
return 1
end try
end tell
end getGreatestFolderNumber
on pad(v)
return text -4 thru -1 of ("000" & v)
end pad

Applescript: Get filenames in folder without extension

I can get the names of all files in a folder by doing this:
tell application "Finder"
set myFiles to name of every file of somePath
end tell
How can I change the strings in myFiles so that they do not include the file extension?
I could for example get {"foo.mov", "bar.mov"}, but would like to have {"foo", "bar"}.
Current solution
Based on the accepted answer I came up with the code below. Let me know if it can be made cleaner or more efficient somehow.
-- Gets a list of filenames from the
on filenames from _folder
-- Get filenames and extensions
tell application "Finder"
set _filenames to name of every file of _folder
set _extensions to name extension of every file of _folder
end tell
-- Collect names (filename - dot and extension)
set _names to {}
repeat with n from 1 to count of _filenames
set _filename to item n of _filenames
set _extension to item n of _extensions
if _extension is not "" then
set _length to (count of _filename) - (count of _extension) - 1
set end of _names to text 1 thru _length of _filename
else
set end of _names to _filename
end if
end repeat
-- Done
return _names
end filenames
-- Example usage
return filenames from (path to desktop)
From http://www.macosxautomation.com/applescript/sbrt/index.html :
on remove_extension(this_name)
if this_name contains "." then
set this_name to ¬
(the reverse of every character of this_name) as string
set x to the offset of "." in this_name
set this_name to (text (x + 1) thru -1 of this_name)
set this_name to (the reverse of every character of this_name) as string
end if
return this_name
end remove_extension
Single line way of doing it, no Finder, no System Events. So more efficient and faster. Side effect (could be good, or bad): a file name ending with "." will have this character stripped out. Using "reverse of every character" makes it works if the name as more than one period.
set aName to text 1 thru ((aName's length) - (offset of "." in ¬
(the reverse of every character of aName) as text)) of aName
The solution as a handler to process a list of names:
on RemoveNameExt(aList)
set CleanedList to {}
repeat with aName in aList
set the end of CleanedList to text 1 thru ((aName's length) - (offset of ¬
"." in (the reverse of every character of aName) as text)) of aName
end repeat
return CleanedList
end RemoveNameExt
Here's an applescriptish method to get Finder's idea of what the stripped filename is but please note it will only work if you have NOT enabled the option in Finder's preferences to "Show all filename extensions":
set extension hidden of thisFile to true
set thisName to displayed name of thisFile
-- display dialog "hey"
set extension hidden of thisFile to false
Here's a full script that does what you wanted. I was reluctant to post it originally because I figured there was some simple one-liner which someone would offer as a solution. Hopefully this solution is not a Rube Goldberg way of doing things.
The Finder dictionary does have a name extension property so you can do something like:
tell application "Finder"
set myFiles to name extension of file 1 of (path to desktop)
end tell
So the above will get you just the extension of the first file on the user's desktop. It seems like there would be a simple function for getting the (base name - extension) but I didn't find one.
Here's the script for getting just the filenames without extension for every file in an entire directory:
set filesFound to {}
set filesFound2 to {}
set nextItem to 1
tell application "Finder"
set myFiles to name of every file of (path to desktop) --change path to whatever path you want
end tell
--loop used for populating list filesFound with all filenames found (name + extension)
repeat with i in myFiles
set end of filesFound to (item nextItem of myFiles)
set nextItem to (nextItem + 1)
end repeat
set nextItem to 1 --reset counter to 1
--loop used for pulling each filename from list filesFound and then strip the extension
--from filename and populate a new list called filesFound2
repeat with i in filesFound
set myFile2 to item nextItem of filesFound
set myFile3 to text 1 thru ((offset of "." in myFile2) - 1) of myFile2
set end of filesFound2 to myFile3
set nextItem to (nextItem + 1)
end repeat
return filesFound2
Though the above script does work if anyone knows a simpler way of doing what the OP wanted please post it cause I still get the sense that there should be a simpler way of doing it. Maybe there's a scripting addition which facilitates this as well. Anyone know?
Based on Lauri Ranta's nice solution, which works for extensions that Finder doesn't know about:
set delims to AppleScript's text item delimiters
set AppleScript's text item delimiters to "."
set myNames to {}
tell application "Finder"
set myFiles to name of every file of (path to Desktop)
repeat with myfile in myFiles
set myname to name of file myfile
if myname contains "." then set myname to (text items 1 thru -2 of myname) as text
set end of myNames to myname
end repeat
end tell
set AppleScript's text item delimiters to delims
return myNames
I don't know how to remove the extensions when you use the "every file"
syntax but if you don't mind looping (loop not shown in example) through each file then this will work:
tell application "Finder"
set myFile to name of file 1 of somePath
set myFile2 to text 1 thru ((offset of "." in myFile) - 1) of myFile
end tell
Within a tell "Finder" block this collects file names stripped of the extension in myNames:
repeat with f in myFiles
set myNames's end to ¬
(f's name as text)'s text 1 thru -(((f's name extension as text)'s length) + 2)
end repeat
For a single file I found the answer here, copied below.
set theFileName to "test.jpg"
set thePrefix to text 1 thru ((offset of "." in theFileName) - 1) of theFileName
This is a little more than you need, but it will handle more than one "." in a file name.
Assuming that a file alias is passed in to the method.
on Process(myFileAlias)
set myFile to myFileAlias as string
set AppleScript's text item delimiters to ":"
set myItemCount to the number of text items in myFile
set myFileName to the last text item of myFile
set myFilePath to text items 1 through (myItemCount - 1) of myFile
set AppleScript's text item delimiters to "."
set myItemCount to the number of text items in myFileName
set myExtension to the last text item of myFile
// This line is the key.
set myShortFilename to text items 1 through (myItemCount - 1) of myFileName as string
log (myFileName)
log (myShortFilename)
end

Resources