-
-
Save oliveratgithub/b9030365c9ae483984ea to your computer and use it in GitHub Desktop.
-- 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 |
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
@Lokissimo thanks for the feedback :)
What you want to do requires some more enhancements to the Drag-n-Drop script:
- First question is: do you want it to allow (multiple) Folders but ALSO Files to be drag'n'dropped? => makes it even more complicated ;)
- 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.
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
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
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
@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
:)
@oliveratgithub true, that makes sense, that could be helpful!
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
@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?
Since the script requires files to be selected, why does it ask us to select files in an open/save dialog?
@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?
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.
@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.
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:
-
Choose files, run script, navigate open/save dialog to find and re-select files, or
-
Choose files, reveal the script-app's icon in Finder, select files, and drag them over.
@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.
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.
I'm looking to actually set an automator to prepend a text to file names. I have been looking for days unsuccessfully. I have managed to create a service that takes file names, creates a variable with such, and renames by prepending, but it won't work. Any help welcome!
@Gahamelas you could modify the Apple Script from this Gist to work with a selected file within an Automator action, instead of a user dialogue to choose files. Automator is capable of running Apple Scripts within an automation step.
@Gahamelas you could modify the Apple Script from this Gist to work with a selected file within an Automator action, instead of a user dialogue to choose files. Automator is capable of running Apple Scripts within an automation step.
Thanks. What I want to accomplish is to select several files in Finder and then run the Automator action that will prompt me to write a name to prepend to those files. Will this do that?
What I want to accomplish is to select several files in Finder and then run the Automator action that will prompt me to write a name to prepend to those files. Will this do that?
@Gahamelas No, the Apple Script here won't do this - unless you'd adjust it.
HOWEVER, try this «Quick Action» in Automator 😉
Cheers
Not to distract you from coming up with a Drafts solution, but this renaming program does that plus much more. It's awesome.
👍 you can do it within Finder itself, to be honest… Right click files > Rename… > Add Text & Prepend. Done
What I want to accomplish is to select several files in Finder and then run the Automator action that will prompt me to write a name to prepend to those files. Will this do that?
@Gahamelas No, the Apple Script here won't do this - unless you'd adjust it.HOWEVER, try this «Quick Action» in Automator 😉
Cheers
This works like a charm! I had similar workflow but I was missing some bits here and there +1: Thank you so much!
👍 you can do it within Finder itself, to be honest… Right click files > Rename… > Add Text & Prepend. Done
Yes, the point of the workflow is to now have to click so many times.
Hi Oliver. is there any way to make the script to run once a day, go to selected folders and to rename the files in those folders to contain a specific string at the very beginning of the file name UNLESS they already contain such string? Imagine I have a folder named X007-007 and throughout the day I would save several files in the folder, at the end of the day I need all files to start with X007-007-a_v1 (where A would) be the number of the file in the folder (v1 is just for a version 1). the next day I need the script to ignore those files with the prefix (to avoid X007-007-a_v1X007-007-a_v1X.....) and just rename the files that are new....(I have several hundreds folders like this, inluding several thousands files, every day adding some 20 new files....and such script would make me 1. happy, 2. organised). In case of a new folder, I would just add one (I hope) line in the code...THANK YOU SUPER BIG TIMES
something like --- rename all files (except for those which are already renamed) in folder X007-007 to X007-007-00A_v1-original name of the file.docx
with in the end the files would be
X007-007-001_v1-opening.docx
X007-007-002_v1-randomfile.doc
X007-007-003_v1-anotherrandomfile.pdf
X007-007-004_v1-original picture.png
and if I add a new file - document.doc, in the evening once I run the script it should be renamed to
X007-007-005_v1-document.doc
(however if I duplicate a randomfile.doc and save it to X007-007-002_v2-randomfile.doc such document should not be renamed....)
Hi Oliver. is there any way to make the script to run once a day, go to selected folders and to rename the files in those folders to contain a specific string at the very beginning of the file name UNLESS they already contain such string?
Hey @PetrKGitHub
Sure something like this would be possible, but it incorporates some additional logics, starting already with a scheduler mechanism. I think you could put something together with "crontab" (if you're technically skilled) or a macOS app giving you a UI to control repeating jobs. The rest needs either a reworked Apple Script or at least 1 additional / preceeding Script.
Overall however, it's not a simple solution and has many "moving pieces" that I can cover here :)
Hi Oliver,
Thank you for the code! I love how easy it is to use. I know it would take some extra manipulation, but is there a way to have it reference a document with a list of names to use instead of using one word and putting a number at the end? Thank you in advance for your help.
I know it would take some extra manipulation, but is there a way to have it reference a document with a list of names to use instead of using one word and putting a number at the end?
@laneharding Sure that’s possible, it requires some rework with additional code though. Here‘s a good discussion about just getting every line of a text file (.txt) into a dynamic list within the script: https://stackoverflow.com/a/48967981/5750030
The question is, if this text file will always be read from the same location, or you‘d choose it manually when the script runs? Also consider error handling when the file happens to be empty. Or what if the number of names in the text file don’t add up to the number of selected files to be renamed?
Assuming you manage to add code to read the lines from text file into a list within the script, definitely you‘d have to disable/remove lines 8 and 17-21. Then adding a repeat, looping through modifying line 9 (set new_name) to take the first name from the text file list, but making sure the next file would take also the 2nd name from the list, etc.
@vegaomar yes, this is possible by enhancing the AppleScript as follows:
end tell
)