Search code examples
macosfileapplescriptfinder

Applescript - move files to folder which name begins with first 7 characters of filename


I've got 2 folders

the first folder contains all the files which I'd like to move to a subfolder of the second folder. I'd like to this based on the first 7 characters of both the file & folder names.

So if the first 7 characters of the subfolder in FOLDER 2 matches the first 7 characters of the file in FOLDER 1. The file get's moved into the subfolder of FOLDER 2

Right now I've got an Applescript which works, but it's terribly slow.

Here's the script so far:

set mgFileList to ""
set mgDestFolder to ""

set mgFilesFolder to (choose folder with prompt "Where are the files stored which you   would like to move to the destination?")
set mgDestFolder to (choose folder with prompt "Where is the destination folder?")


set folderList to contents of mgDestFolder


tell application "Finder" to set fileList to files of mgFilesFolder

repeat with aFile in fileList
set prefix to getPrefix(name of aFile)
tell application "Finder"

     try
        set destinationFolder to (1st folder of mgDestFolder whose name begins with prefix)
        move aFile to destinationFolder
    end try

end tell
end repeat



on getPrefix(aName)
set prefix to text 1 thru 7 of aName
return prefix
end getPrefix

I've only recently got into Applescripting. Can this be done more efficiently within Applescript? I've searched around for a solution which works with a shell script (which I think will probably be a lot faster), but haven't been able to get any of them working.

I'm working on OSX Mountain Lion 10.8.4

-- edit

I see that I've uploaded the wrong version of the script I've managed to put together so far. Above is the script that is working, but it's really slow. Probably because it doesn't use any shell script.

---------------update-------------------

Here is the final script that is working pretty fast right now:

set mgFilesFolder to choose folder with prompt "Where are the files stored which you would like to move to the destination?"
set mgDestFolder to choose folder with prompt "Where is the destination folder?"

tell application "System Events"
set fileList to files of mgFilesFolder whose name does not start with "."

repeat with aFile in fileList
    set prefix to my getPrefix(name of aFile)
    try
        set destinationFolder to (1st folder of mgDestFolder whose name  begins with prefix)
        move aFile to POSIX path of destinationFolder
    end try
end repeat
end tell


on getPrefix(aName)
try
    set prefix to text 1 thru 7 of aName
    return prefix
on error
    return aName
end try
end getPrefix

Solution

  • The Finder is generally a slow program because it does a lot of things on your computer. Therefore you should avoid using it if possible. In your case these tasks can be done using System Events. Try this, maybe it will be faster. Note that you had a couple mistakes in your code which are fixed in this code.

    set mgFilesFolder to choose folder with prompt "Where are the files stored which you would like to move to the destination?"
    set mgDestFolder to choose folder with prompt "Where is the destination folder?"
    
    tell application "System Events"
        set fileList to files of mgFilesFolder whose name does not start with "."
    
        repeat with aFile in fileList
            set prefix to my getPrefix(name of aFile)
            try
                set destinationFolder to (1st folder of mgDestFolder whose name begins with prefix)
                move aFile to POSIX path of destinationFolder
            end try
        end repeat
    end tell
    
    
    on getPrefix(aName)
        try
            set prefix to text 1 thru 7 of aName
            return prefix
        on error
            return aName
        end try
    end getPrefix