shell: Получить путь к файлам, скопированным Finder - PullRequest
0 голосов
/ 30 октября 2018

Я хочу получить путь к файлам, скопированным Finder в моем скрипте zsh. Я не против вызвать внешнюю утилиту / скрипт.

Я пытался pbpaste, он просто возвращает базовое имя одного из скопированных файлов.

PS: файлы копируются вручную с помощью cmd + c в Finder.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы можете скопировать полные пути к файлам в буфер обмена в Finder , используя C .

Однако существуют и другие ситуации, когда необходимо извлечь файлы из буфера обмена. Часть кода AppleScript ниже извлечет набор файлов, последний раз скопированных в буфер обмена, используя C в Finder . Первоначально он извлекает сами файловые объекты, которые в AppleScript могут использоваться различными способами. Однако последняя половина сценария преобразует файловые объекты в простой список путей файла posix, а затем объединяет его в строку, ограниченную переводом строки.

use framework "AppKit"

property this : a reference to current application
property NSPasteboard : a reference to NSPasteboard of this
property NSURL : a reference to NSURL of this

property text item delimiters : linefeed

set pb to NSPasteboard's generalPasteboard()
set fs to (pb's readObjectsForClasses:[NSURL] options:[]) as list

repeat with f in fs
    set f's contents to POSIX path of f
end repeat

fs as text

Чтобы реализовать это в zsh, вы можете использовать osascript примерно так:

osascript -e "use framework \"AppKit\"

property this : a reference to current application
property NSPasteboard ..."

Или вы можете сохранить AppleScript в виде файла, используя Редактор сценариев с расширением .scpt (скомпилированный код) или .applescript (текст), а затем запустить его из командной строки следующим образом:

osascript /path/to/file.applescript
0 голосов
/ 30 октября 2018

Не видя ваш код относительно скопированных элементов Finder, трудно дать вам точное решение. Вот одно из возможных решений. Следующий код AppleScript примет выбранные в данный момент элементы поиска и установит в буфер обмена полные пути к файлам этих выбранных элементов поиска в виде списка.

tell application "Finder" to set selectedFiles to selection as alias list
if selectedFiles is {} then return
set filePaths to {}
repeat with thisFile in selectedFiles
    set end of filePaths to POSIX path of thisFile
end repeat
set text item delimiters to linefeed
set the clipboard to (filePaths as text)

OR

Поскольку ваш процесс заключается в копировании выбранных файлов поиска в буфер обмена с помощью сочетания клавиш cmd + c, вы можете использовать следующий AppleScript-код в Automator.app и сохранить его в качестве службы. В System Preferences.app вы можете назначить сочетание клавиш для вашего нового сервиса.

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

Короче говоря, этот код AppleScript отобразит диалоговое окно с двумя вариантами.

1) Записать пути файлов выбранных в данный момент файлов поиска во временный текстовый файл (который может быть получен при необходимости)

2) Установите в буфере обмена пути к файлам, извлекая эту информацию из временного файла

tell application "Finder" to set selectedFiles to selection as alias list
if selectedFiles is {} then return
set filePaths to {}
repeat with thisFile in selectedFiles
    set end of filePaths to POSIX path of thisFile
end repeat
set text item delimiters to linefeed
set filePaths to (filePaths as text)

set readOrWrite to {"Write Selected Files' File Path To Temp", "Set Clipboard To The File Paths"}

activate
set theChoice to (choose from list readOrWrite ¬
    with title "CHOOSE YOUR OPTION PLEASE" with prompt ¬
    "Write File Paths Or Set Clipboard To File Paths?" default items 1 ¬
    OK button name "DO IT" cancel button name "Cancel") as string

if theChoice is "Write Selected Files' File Path To Temp" then
    writeToFile(filePaths)
else if theChoice is "Set Clipboard To The File Paths" then
    readFile()
else
    return
end if


on writeToFile(filePaths)
    set theFile to "/tmp/File_Paths.txt"
    set theText to filePaths
    try
        set writeToFile to open for access theFile with write permission
        set eof writeToFile to 0
        write theText & linefeed to writeToFile as text starting at eof
        close access theFile
    on error errMsg number errNum
        close access theFile
        set writeToFile to open for access theFile with write permission
        set eof writeToFile to 0
        write theText & linefeed to writeToFile as text starting at eof
        close access theFile
    end try
end writeToFile

on readFile()
    set theFile to "/tmp/File_Paths.txt"
    set the clipboard to (read theFile)
end readFile

enter image description here

enter image description here

После сохранения информации о пути к файлу вы сможете скопировать элементы поиска с помощью сочетания клавиш cmd + c и делать все, что захотите, со скопированными файлами поиска.

Затем вернитесь и снова запустите службу, чтобы скопировать пути к файлам в буфер обмена

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...