Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Simple AppleScript to easily batch rename multiple files sequentially. GUI asks user to select files and input a name before renaming.
-- This code comes from https://gist.github.com/oliveratgithub/
-- Open in AppleScript Editor and save as Application
-- ------------------------------------------------------------
--this is required to break the filename into pieces (separate name and extension)
set text item delimiters to "."
tell application "Finder"
set all_files to every item of (choose file with prompt "Choose the Files you'd like to rename:" with multiple selections allowed) as list
display dialog "New file name:" default answer ""
set new_name to text returned of result
--now we start looping through all selected files. 'index' is our counter that we initially set to 1 and then count up with every file.
--the 'index' number is of course required for the sequential renaming of our files!
repeat with index from 1 to the count of all_files
--using our index, we select the appropriate file from our list
set this_file to item index of all_files
set {itemName, itemExtension} to {name, name extension} of this_file
--if the index number is lower than 10, we will add a preceding "0" for a proper filename sorting later
if index is less than 10 then
set index_prefix to "0"
else
set index_prefix to ""
end if
--
--lets check if the current file from our list (based on index-number) has even any file-extension
if itemExtension is "" then
-- "" means there is no file-extension present.
set file_extension to ""
else
--yup, we are currently processing a file that has a file-extension
--we have to re-add the original file-extension after changing the name of the file!
set file_extension to "." & itemExtension
end if
--let's rename our file, add the sequential number from 'index' and add the file-extension to it
set the name of this_file to new_name & index_prefix & index & file_extension as string
end repeat
--congratulations for successfully accomplishing the batch renaming task :)
display alert "All done! Renamed " & index & " files with '" & new_name & "' for you. Have a great day! :)"
end tell
-- This code comes from https://gist.github.com/oliveratgithub/
-- Open in AppleScript Editor and save as Application
-- ------------------------------------------------------------
--this is required to break the filename into pieces (separate name and extension)
set text item delimiters to "."
-- Let the App receive drag'n'dropped files
on open theDroppedItems
-- build the file list based on the dropped files
set all_files to every item of theDroppedItems as list
tell application "Finder"
display dialog "New file name:" default answer ""
set new_name to text returned of result
--now we start looping through all selected files. 'index' is our counter that we initially set to 1 and then count up with every file.
--the 'index' number is of course required for the sequential renaming of our files!
repeat with index from 1 to the count of all_files
--using our index, we select the appropriate file from our list
set this_file to item index of all_files
set {itemName, itemExtension} to {name, name extension} of this_file
--if the index number is lower than 10, we will add a preceding "0" for a proper filename sorting later
if index is less than 10 then
set index_prefix to "0"
else
set index_prefix to ""
end if
--
--lets check if the current file from our list (based on index-number) has even any file-extension
if itemExtension is "" then
-- "" means there is no file-extension present.
set file_extension to ""
else
--yup, we are currently processing a file that has a file-extension
--we have to re-add the original file-extension after changing the name of the file!
set file_extension to "." & itemExtension
end if
--let's rename our file, add the sequential number from 'index' and add the file-extension to it
set the name of this_file to new_name & index_prefix & index & file_extension as string
end repeat
--congratulations for successfully accomplishing the batch renaming task :)
display alert "All done! Renamed " & index & " files with '" & new_name & "' for you. Have a great day! :)"
end tell
end open
@oliveratgithub

This comment has been minimized.

Copy link
Owner Author

oliveratgithub commented Aug 18, 2015

Update August 18, 2015: the script will now add a preceding "0" to the index-number as long as the number is lower than 10 - this helps a better file name sorting in the filesystem(s) later. I.E. using "01", "02",..."10" etc. instead of "1", "2",..."10".

@sybon

This comment has been minimized.

Copy link

sybon commented Mar 26, 2016

Dear Oliver,
Thank you for your script !
I was really happy to get such a flexible tool to bulk rename my files !

Have a nice day,

Best regards,

Sylvain

@DarthAztek

This comment has been minimized.

Copy link

DarthAztek commented Dec 14, 2016

Thanks so much for this script! It has helped me immensely! By any chance, is there a way to extrapolate a before-and-after text file that's saved to the desktop, so that a user can reference the new file names to the old?

@oliveratgithub

This comment has been minimized.

Copy link
Owner Author

oliveratgithub commented Dec 18, 2017

@jonhaloi tagging you here, because I think this AppleScript might be helpful for your question asked in my other Gist?

Oliver, I'm new to Applescript. I've been trying to name a group of files that are in a folder. I want to name the files according to a text list. For example, how would I apply a list of names (1,2,3,4,5) to a group of files in a folder whose current names are (a,b,c,d,e). I've searched the Internet and have been directed to your code above. I just can't seem to figure out how to do it. Any thoughts?
https://gist.github.com/oliveratgithub/acedf41a60f4cff1f8e1d1a777cff021#gistcomment-2132226

@philippeibach

This comment has been minimized.

Copy link

philippeibach commented Jan 17, 2018

Hey Oliver, this script is awesome.. super convenient. thanks a lot.
short question: what would you need to change to allow the file input via drag&drop on the app icon, instead of the prompt? I was trying, but did not get it.. only renaming all my files on the desktop to test01,... haha :)
thanks for any tip!
best, Philipp

@vegaomar

This comment has been minimized.

Copy link

vegaomar commented Jan 20, 2018

Hi Oliver, I am quote new to Script Editor. I like the above text and seems helpful. My ask is that I want to delete the letter " " from certain file names and replace by "-". How to amend the above text to do that?

@oliveratgithub

This comment has been minimized.

Copy link
Owner Author

oliveratgithub commented Jan 24, 2018

@philippeibach

what would you need to change to allow the file input via drag&drop on the app icon, instead of the prompt?

That's pretty simple - I attached an additional version of the script, which you can save as "Application" from Script Editor & then drag'n'drop files onto it! :)

See Drag-n-Drop Files Batch Rename.scpt
(for the sake of time, I didn't implement a fallback to the file chooser, in case the App is opened manually)

Cheers,
Oliver

@oliveratgithub

This comment has been minimized.

Copy link
Owner Author

oliveratgithub commented Jan 24, 2018

@vegaomar yes, this is possible by enhancing the AppleScript as follows:

  1. add the following code to the very bottom of the script (after end tell)
on replace_text(search_string, replacement_string, this_text)
	set prevTIDs to AppleScript's text item delimiters
	set AppleScript's text item delimiters to the search_string
	set the item_list to every text item of this_text
	set AppleScript's text item delimiters to the replacement_string
	set this_text to the item_list as string
	set AppleScript's text item delimiters to prevTIDs
	return this_text
end replace_text
  1. then change line #9 as shown in the following before & after
  • before:
set new_name to text returned of result
  • after:
set new_name to my replace_text(" ", "-", text returned of result)
@Lokissimo

This comment has been minimized.

Copy link

Lokissimo commented Mar 14, 2018

Oliver!

Thank you so much for this script... It is really helping me understand how scripting works.

I am trying to modify this for my specific task without avail. I would like to drop a folder on the droplet and have it name
all of the files within it sequentially as "Name of Folder" + "_" + number. So far, the following gets me the foldername:

on open theDroppedItems

tell application "Finder"
	
	set Foldername to (name of (info for theDroppedItems))
	display dialog Foldername as string
	set new_name to Foldername & "_"

But when I try to access the files in the folder using:

set all_files to (every file of Foldername as list)

I get an error! What am I doing wrong?

Thanks,

Matt

@oliveratgithub

This comment has been minimized.

Copy link
Owner Author

oliveratgithub commented Apr 12, 2018

@Lokissimo thanks for the feedback :)

What you want to do requires some more enhancements to the Drag-n-Drop script:

  1. First question is: do you want it to allow (multiple) Folders but ALSO Files to be drag'n'dropped? => makes it even more complicated ;)
  2. When you drag a folder onto the Script-Application, you have to go "inside" the dropped folder(s) in order to process only the files WITHIN => your code snippet renames only the Folder itself

You can find a pretty good example code here:
https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/ProcessDroppedFilesandFolders.html#//apple_ref/doc/uid/TP40016239-CH53-SW10

If I find the time, i might enhance the script to allow drag'n'dropping of Files & Folders alike. At a first try, I didn't get it to work properly.

@antonkvm

This comment has been minimized.

Copy link

antonkvm commented Jul 7, 2019

Hi! Thanks for posting this script, its pretty much what I looked for, but I have trouble understanding what line 15+16 in your code do and what they are good for. All I know is that my version doesn't work unless I have them in there :D

These are the lines I'm talking about:

	set file_name_count to text items of (get name of this_file)
	set {itemName, itemExtension} to {name, name extension} of this_file

If you could give me some pointers, it would be very appreciated!

Thanks,
Anton

@oliveratgithub

This comment has been minimized.

Copy link
Owner Author

oliveratgithub commented Jul 9, 2019

Hi @antonkvm, thanks for your feedback - glad it is helpful :)

set file_name_count to text items of (get name of this_file)

This counts the individual parts of a files' name (e.g. filename = 1, extension = +1) and saves this number for the current file which is being processed into the variable "file_name_count". HOWEVER, this line is actually deprecated since the last script revision and should be removed (I'll do this right away). See the Revision history for how it used to be used for checking if the file has an extension – or not: Batch File Rename.scpt » Revisions

set {itemName, itemExtension} to {name, name extension} of this_file

This creates an array containing the original files 'name' and 'extension' parts and is needed to re-add the same file extension after renaming, see line #31

--we have to re-add the original file-extension after changing the name of the file!
set file_extension to "." & itemExtension

Cheers,
Oliver

@antonkvm

This comment has been minimized.

Copy link

antonkvm commented Jul 10, 2019

Hi @oliveratgithub, thanks for the reply! I now managed to get my code to work as intended, with the help of your explanation above =)

I've noticed though that the variable "itemName" doesn't get used after it's declared together with "itemExtension" in the array, so couldn't

set {itemName, itemExtension} to {name, name extension} of this_file

be condensed to

set itemExtension to name extension of this_file

?

Again, thanks for helping me out and have a great day!

Cheers,
Anton

@oliveratgithub

This comment has been minimized.

Copy link
Owner Author

oliveratgithub commented Jul 10, 2019

@antonkvm that's correct and your change would be a viable alternative.

I decided to keep the declaration of itemName in the code, because someone who modifies the script / takes the script as a basis, may be glad to know it's there. E.g. you could write a log / message showing exactly which (old) itemName was renamed into which (new) new_name :)

@antonkvm

This comment has been minimized.

Copy link

antonkvm commented Jul 10, 2019

@oliveratgithub true, that makes sense, that could be helpful!

@Alexollon

This comment has been minimized.

Copy link

Alexollon commented Dec 31, 2019

Hi guys,

I would need an Apple script that renames all files in a folder (including folders) from

originalfilename -->
YYYYMMDD_FOLDERNAME_originalfilename

where YYYYMMDD is the creation date of the file.

It should run in all subfolders automatically starting from top hierarchy down. Also Folders should be renamed with that logic.

2 Examples:
/2001 Fotos/2001 Xmas/foto1.jpg --> /2001 Fotos/2001 Fotos_2001 Xmas/2001 Fotos_2001 Xmas_foto1.jpg
/2001 Fotos/2001 Xmas/Originals/foto1.jpg --> /2001 Fotos/2001 Fotos_2001 Xmas/2001 Fotos_2001 Xmas_Originals/2001 Fotos_2001 Xmas_Originals_foto1.jpg

Would be really great to help me out!!!!

Thx guys and happy new year!
Alex

@oliveratgithub

This comment has been minimized.

Copy link
Owner Author

oliveratgithub commented Jan 2, 2020

@Alexollon I‘m afraid you‘ll need to put something like that together yourself, as it‘s a very specific scenario and needs more logic (parsing hierarchy, reading file creation time, concert such, rename files by folder, etc.).

Maybe for this case you may want to look what you could achieve using Automator.app and it‘s built in UI commands for file and folder manipulation?

@Jimmbo

This comment has been minimized.

Copy link

Jimmbo commented Jan 22, 2020

Since the script requires files to be selected, why does it ask us to select files in an open/save dialog?

@oliveratgithub

This comment has been minimized.

Copy link
Owner Author

oliveratgithub commented Jan 22, 2020

@Jimmbo Update: I checked again and - yes - it does ask for files of course, when running the script without drag‘n‘dropping files onto it (2nd solution), because how would it otherwise know which files you want to rename?

But probably I still don’t fully understand your question @Jimmbo - can you elaborate what‘s wrong or confusing about the „Choose file…“-dialogue?

@Jimmbo

This comment has been minimized.

Copy link

Jimmbo commented Jan 22, 2020

Screen Shot 2020-01-22 at 11 35 04 AM

@Jimmbo

This comment has been minimized.

Copy link

Jimmbo commented Jan 23, 2020

If you select files, launch script, then need to navigate open/save dialog to select files, that seems a tad redundant to me. I'd expect it to just rename the files I've chosen.

@oliveratgithub

This comment has been minimized.

Copy link
Owner Author

oliveratgithub commented Jan 24, 2020

@Jimmbo ah I understand. For this use case I‘d recommend using the 2nd script and save it as an application. Then you can simply drag‘n‘drop your files onto the Script application to start renaming exactly these files.

@Jimmbo

This comment has been minimized.

Copy link

Jimmbo commented Jan 24, 2020

Ok, thanks. So if I understand correctly, in order to suit the script's need to check twice which files it will process, I need to slow my workflow in one of two ways:

  1. Choose files, run script, navigate open/save dialog to find and re-select files, or

  2. Choose files, reveal the script-app's icon in Finder, select files, and drag them over.

@oliveratgithub

This comment has been minimized.

Copy link
Owner Author

oliveratgithub commented Jan 24, 2020

@Jimmbo OR you ONCE save the Script Drag-n-Drop Files Batch Rename.scpt from within Script Editor as File Format "Application", then drag newly created Application's icon to your Dock.
Now you have it accessible basically all the time to drag'n'drop files onto it from everywhere in Finder. It will ask for what new name to give them still, of course – if you don't need that part of the script, remove it / hard code any custom name you always want to use or modify it to just add continuous numbering without changing the name at all.

Otherwise you use the new right-click > "Rename X items…"-function in Finder directly or use a tool like A Better Finder Rename, if that fits better into your workflow.

@Jimmbo

This comment has been minimized.

Copy link

Jimmbo commented Jan 24, 2020

Thanks Oliver. I actually own several renaming apps, but was looking for a script I could use within a larger script to streamline my workflow.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.