Я сделал этот сценарий Applescript для создания символьных ссылок.
Appart от POSIX path of
, как я могу получить имя файла, без пути, перемещаемого файла?
on open filelist
repeat with i in filelist
do shell script "ln -s " & POSIX path of i & " /Users/me/Desktop/symlink"
end repeat
end open
PS: Я знаю, что это ожидает, что много файлов будут отброшены, и пытается создать много ссылок с тем же именем, которое дает ошибку. На самом деле я скопировал этот пример с веб-сайта и поскольку я почти ничего не знаю о Applescript, я не знаю, как сделать это для единственного файла, справка на этом ценилась бы также.
Я не уверен, что именно вы пытаетесь сделать, но у меня есть предположение. Есть ли идея, что вы хотите взять каждый файл, помещенный в сценарий, и создать символическую ссылку на каждый из них на рабочем столе? Поэтому, если я отброшу ~ / look / at / me
и ~ / an / example
, у вас будут ~ / Desktop / me
и ~ / Рабочий стол / пример
? Если это то, что вы хотите, то вам повезло: ln -s
делает именно это. ( Изменить: Хотя вы должны остерегаться случая с двумя аргументами.) Таким образом, ваш код может выглядеть так:
-- EDITED: Added the conditional setting of `dest` to prevent errors in the
-- two-arguments-to-ln case (see my comment).
on quoted(f)
return quoted form of POSIX path of f
end quoted
on open filelist
if filelist is {} then return
set dest to missing value
if (count of filelist) is 1 then
tell application "System Events" to set n to the name of item 1 of filelist
set dest to (path to desktop as string) & n
else
set dest to path to desktop
end if
set cmd to "ln -s"
repeat with f in filelist & dest
set cmd to cmd & " " & quoted(f)
end repeat
do shell script cmd
end open
Обратите внимание на использование цитируемой формы
; он заключает свой аргумент в одинарные кавычки, поэтому выполнение в оболочке не сделает ничего забавного.
Если вы хотите получить имя файла по другой причине, вам не нужно обращаться к Finder; вместо этого вы можете использовать системные события:
tell application "System Events" to get name of myAlias
вернет имя файла, хранящегося в myAlias
.
Изменить: Если вы хотите что-то сделать с одним файлом, это довольно просто. Вместо использования repeat
для итерации по каждому файлу просто выполните то же действие с первым файлом, доступ к которому осуществляется через элемент 1 списка
. В этом случае вам может понадобиться что-то вроде этого:
-- EDITED: Fixed the "linking a directory" case (see my comment).
on quoted(f)
return quoted form of POSIX path of f
end quoted
on open filelist
if filelist is {} then return
set f to item 1 of filelist
tell application "System Events" to set n to the name of f
do shell script "ln -s " & ¬
quoted(f) & " " & quoted((path to desktop as string) & n)
end open
Это почти то же самое, но мы берем первый элемент в filelist
и игнорируем остальные.Кроме того, в конце мы отображаем диалоговое окно, содержащее имя символической ссылки, чтобы пользователь знал, что только что произошло.
В качестве примера вы можете работать с Finder вместо сценария оболочки, чтобы получить имя одного файл, который помещается в сценарий, сохраненный как приложение. Если вам не нужен диалог отображения, вы можете удалить его, но у вас есть имя файла в качестве переменной для работы:
on open the_files
repeat with i from 1 to the count of the_files
tell application "Finder"
set myFileName to name of (item i of the_files)
end tell
display dialog "The file's name is " & myFileName
end repeat
end open