Perfomance and Other Improvements
A few things:

There's already a recursive overload of EnumerateFiles so you don't need getAllFiles. Your top level function would be:

let moveFrom source =
  Directory.EnumerateFiles(source, "*", SearchOption.AllDirectories)
    |&gt; Seq.filter (fun f -&gt; Path.GetExtension(f).ToLower() &lt;&gt; ".db")  //exlcude the thumbs.db files
    |&gt; move """C:\_EXTERNAL_DRIVE\_Camera"""
  printfn "Done"


:? Exception is a type test pattern match, which is unnecessary in a try/with because with only fires for exceptions anyway. You could do this:

let getDateTaken file =
  try dateTakenFromExif file
  with _ -&gt; File.GetLastWriteTime(file)


and this:

try File.Copy(file, newFile)
with e -&gt; failwith (sprintf "error renaming %s to %s\n%s" file newFile e.Message)


instead.

addToFile could be merged into getNewFileName to form a simpler function without repetition:

let getNewFilename newFilePath =
  let rec loop file n =
    if File.Exists(file) then 
      let fileDir = Path.GetDirectoryName(file)
      let nextFile = Path.GetFileNameWithoutExtension(file) + "-" + n.ToString() + Path.GetExtension(file)
      loop (Path.Combine(fileDir, nextFile)) (n+1)
    else file
  loop newFilePath 2


For easy parallelization you might try using PSeq ("parallel sequence") from the F# PowerPack. You might see some gains from simply doing this:

files |&gt; PSeq.iter moveHelper