Дублировать и переименовывать выбор Finder в ту же папку за один чистый шаг?

Возможно ли такое? У меня есть этот код, который может сделать выше:

set now to do shell script "date +%Y-%m-%d' '%H.%M.%S"
tell application "Finder"
    set finderSelList to selection as alias list
    try
        set fileDir to parent of first item of finderSelList as alias
    on error
        return "No selection"
    end try

    set dupeList to (duplicate finderSelList to fileDir) as list

    repeat with i from 1 to (count of dupeList)
        set ((dupeList)'s (item i)'s name) to ((finderSelList)'s (item i)'s name) & " [" & now & "]." & ((finderSelList)'s (item i)'s name extension)
    end repeat
end tell

return dupeList

Однако это не так чисто — то есть вы можете видеть, что дубликаты файлов имеют имена <file name> 2.<file extension>, а через секунду получают имена <file name> [date].<file extension>, что довольно неприятно видеть.

У меня есть чистое решение bash (т.е. не раздражающее), но использование Finder для копирования файлов имеет некоторые преимущества (например, индикаторы выполнения, отмена операций копирования, различная обработка xattr и т. д.):

finderSelection=$(osascript getfinderselection.scpt)

now=$(date +%Y-%m-%d' '%H.%M.%S)

if [ "$finderSelection" ]
    then
    echo "$finderSelection" |
    while IFS= read -r file
    do
        fileDir=$(dirname "$file")
        fileBaseN=$(basename "$file")
        fileName="${fileBaseN%.*}"
        fileExt="${fileBaseN##*.}"

        cp -r "$file" "$fileDir/[$now] $fileName.$fileExt"
    done

    afplay "/System/Library/Components/CoreAudio.component/Contents/SharedSupport/SystemSounds/system/Volume Mount.aif"

fi

... и getfinderselection.scpt содержит:

tell application "Finder"
    set finderSelList to selection as alias list
end tell

if finderSelList ≠ {} then
    repeat with i in finderSelList
        set contents of i to POSIX path of (contents of i)
    end repeat

    set AppleScript's text item delimiters to linefeed
    finderSelList as text
end if

В этой реализации, когда bash дублирует файлы, вы не видите никакого промежуточного шага, на котором файлы переименовываются. Нет — когда появляются дубликаты, их имена файлов уже финализированы.

Так...

  • Есть ли способ реализовать эту идею в AppleScript, но сделать это не так резко и гораздо более гладко, как это делает bash?
  • Во-первых, должен ли я работать с решением AppleScript или с решением bash?
  • Как еще можно улучшить предпочтительное решение? Для решения AppleScript мне нужно найти способ удалить расширение файла из ((finderSelList)'s (item i)'s name), а также удалить конец .при работе с папками. Для решения bash выходные данные fileName и fileExt, особенно для папок, могут быть неожиданными и беспорядочными.

Ответы (1)

Для вашего решения applescript вы можете продублировать его во временный каталог (желательно в той же файловой системе), а затем переименовать их обратно в исходный каталог. Я пытался взломать это для вас, но сдался...

Если вам нужна альтернатива, вместо bash вы можете посмотреть этот ответ https://stackoverflow.com/a/275945/1942837 , который предоставляет (предположительно) хороший графический интерфейс Python с прогрессом (я не тестировал это).