2015-05-16 1 views
0

Я пытаюсь переместить кучу файлов в папки на основе даты создания файла. Используя приведенный ниже сценарий, скорость перемещения составляет около 1 файла в секунду. 64000 файлов. Script тайм-аут, когда я попыталсяAppleScript мертв медленно в перемещении файлов в папку

set myFiles to items of myFolder whose name ends with "jpg" 
repeat with aFile in myFiles 

Так что теперь я обрабатываю файл файл и только проверка папки существующей, когда сравнение даты не удалось ускорил процесс лишь незначительно. Я пробовал очевидное

set myDayBuddies to items of myFolder whose creation date is theFileDate 

но это тоже не очень помогло. Я подозреваю, что Finder снова и снова считывает содержимое папки, создавая огромные накладные расходы.

Каков правильный способ ускорения этого? На PHP я знаю, что могу читать записи из потока каталога, один за другим.

Сценарий:

tell application "Finder" 
    set myFolder to choose folder 
    set prevDateString to "" 
    repeat while true 
     try 
      set aFile to first item of myFolder whose name ends with "jpg" 
      set theFileDate to (the creation date of aFile) 
      set theDateString to my composedate(theFileDate) 
      if (theDateString is not prevDateString) then 
       if not (exists folder ((myFolder & theDateString) as text)) then 
        make new folder at myFolder with properties {name:theDateString} 
       end if 
       set prevDateString to theDateString 
       set destPath to (((myFolder as text) & theDateString) as alias) 
      end if 
      move aFile to destPath 
     on error 
      return 
     end try 
    end repeat 
end tell 
on composedate(aDate) 
    set y to (year of aDate as integer) as string 
    set m to (month of aDate as integer) as string 
    set d to (day of aDate as integer) as string 
    if length of m < 2 then 
     set m to "0" & m 
    end if 
    if length of d < 2 then 
     set d to "0" & d 
    end if 
    set myDateString to y & m & d 
    return myDateString 
end composedate 
+0

изучение нового языка или дайвинг в Терминале только немного слишком много для ускорения его 8-) Я бы скорее хотел бы узнать, как уменьшить накладные расходы в Applescript/Finder в текущей ситуации. Одна вещь, в то время как скрипт хруст прочь, заключается в том, что я привязал действие папки к папке с похожим скриптом, так что новые файлы убираются немедленно и не складываются. – user1789266

+0

Спасибо Matt, «текущая ситуация» такая же, как в «Applescript», а не как «с 60 000 файлов слева». Ваше замечание о неэффективной обработке даты привело к тестированию текста (файлы имеют дату в имени файла). Действия с файлами будут очищать новые файлы с этого момента, хруст на других 60 000 файлах займет, ну, некоторое время. У меня были надежды где-то скрытые, в Applescript будет опция «читать файл по файлу из ресурса», как и в PHP. – user1789266

ответ

0

системных событий был создан, чтобы занять большую часть разгружает Finder. Finder работает медленно, поэтому, когда это возможно, используйте системные события. Я не уверен, как он будет работать в папке с 64000 файлами, но попробуй.

set myFolder to choose folder 

tell application "System Events" 
    set f to files of myFolder whose name extension is "jpg" 
end tell 

И если системные события все еще слишком медленные, то сам applescript не подходит для такой большой папки. Вам нужно будет использовать командную строку, даже если вы сказали, что не хотите. Что-то, как это должно быть быстрее ...

set myFolder to (choose folder) as text 
set jpgFiles to paragraphs of (do shell script "ls " & quoted form of POSIX path of myFolder & " | grep 'jpg$'") 

repeat with aFile in jpgFiles 
    set filePath to myFolder & aFile 
    tell application "System Events" 
     set theFileDate to creation date of file filePath 
     -- do more stuff 
    end tell 
end repeat 
+0

Спасибо! Не может голосовать, слишком низкая репутация 8 (. – user1789266

Смежные вопросы