Esse código AppleScript funciona para mim usando a versão mais recente do macOS Mojave.
Esse código percorrerá todos os itens da lixeira, retornando cada item ao local original.
Se alguma das pastas de origem originais dos arquivos na Lixeira não existir mais, o repeat until trashCount is 0
comando sairá do loop. Todos os arquivos restantes na Lixeira serão apenas arquivos que não puderam ser recuperados por esse motivo.
ATUALIZAR
Como é possível selecionar um item na área de trabalho durante o ciclo de repetição do processo de devolução de arquivos da lixeira, o item da área de trabalho selecionado pode ser pego no processo e ser movido para a lixeira. Para evitar esse cenário, adicionei um código que bloqueará os itens da área de trabalho desbloqueados no momento e também os desbloqueará no final do script.
Como agora todos os itens da área de trabalho estão bloqueados ... Durante o processo de colocar de volta os arquivos da lixeira, se por algum motivo você selecionar acidentalmente um arquivo ou pasta na área de trabalho e o código tentar processar esse item da área de trabalho selecionado ... gere uma janela de diálogo mencionando que o item está bloqueado e pergunte se você deseja continuar enviando-o para a lixeira. O bloco Tell do System Events no final do script tratará de todas as caixas de diálogo que possam ter sido geradas.
property desktopFolder : path to desktop
property unlockedFiles : missing value
tell application "Finder"
set trashCount to count of every item of trash
set unlockedFiles to (items of desktopFolder whose locked is false)
repeat with i in unlockedFiles
set locked of i to true
end repeat
end tell
repeat until trashCount is 0
tell application "Finder" to set orphanCount to count of every item of trash
putFilesBack()
tell application "Finder" to set trashCount to count of every item of trash
if orphanCount is equal to trashCount then exit repeat
end repeat
delay 1
tell application "System Events"
repeat until not (exists of button "Stop" of scroll area 1 of window 2 of application process "Finder")
if exists of button "Stop" of scroll area 1 of window 2 of application process "Finder" then
click button "Stop" of scroll area 1 of window 2 of application process "Finder"
end if
end repeat
end tell
tell application "Finder"
close every Finder window
delay 1
repeat with i in unlockedFiles
set locked of i to false
end repeat
end tell
on putFilesBack()
global trashFiles, trashCount, thisItem
tell application "Finder"
set trashFiles to every item of trash
set frontmost to true
repeat while not frontmost
delay 0.1
end repeat
my closeFinderWindows()
end tell
delay 0.1
tell application "System Events"
tell application process "Finder"
repeat with i from 1 to count of trashFiles
set thisItem to item i of trashFiles
delay 0.1
set frontmost to true
select thisItem
delay 0.1
try
key code 51 using {command down}
end try
delay 0.1
my closeFinderWindows()
delay 0.1
end repeat
end tell
end tell
tell application "Finder" to set trashCount to count of every item of trash
end putFilesBack
on closeFinderWindows()
tell application "Finder"
set finderWindowRef to (a reference to (every Finder window whose name is not "Trash"))
set finderWindowRef to contents of finderWindowRef
close (items of finderWindowRef)
end tell
end closeFinderWindows