Como criar um serviço OS X que transmite o caminho de um arquivo para um script de shell?

3

Eu tenho um script de shell que aceita dois argumentos:

  • caminho completo do arquivo
  • nome do arquivo

Como posso usar o Automator para adicionar uma entrada de menu de contexto ao Finder para executar o script de shell com um caminho de arquivo escolhido e nome de arquivo como argumentos?

    
por Milen 31.12.2011 / 11:12

1 resposta

7

Selecione para criar um Serviço no Automator que receba arquivos e pastas selecionados apenas como entrada no Localizador . Adicione a ação Executar Script Shell e passe a entrada como argumentos .

Os argumentos que você recebe são os caminhos Unix completos dos arquivos e pastas selecionados. Usando growlnotify , parte de Growl para fins de demonstração:

enter image description here

Rosnar mensagem como resultado da execução em um arquivo:

enter image description here

O comando aparece no menu de contexto de um arquivo ou pasta no Finder. Se houver muitos Serviços aplicáveis, eles serão agrupados em um submenu Serviços .

enter image description here

Se o seu script exigir ambos o caminho completo do arquivo, e o nome do arquivo , você pode fazer algo como o seguinte, primeiro extraindo o nome do arquivo do caminho completo:

for f in "$@"
do
    name="$( basename $f )"
    /usr/local/bin/growlnotify "$name" -m "$f"
done

Você pode ver que o nome do arquivo é usado como título, enquanto o caminho é usado como mensagem no Growl:

enter image description here

Se você precisar consultar informações adicionais, poderá executar um AppleScript curto para fazer isso. A seguir, um script de shell completo (como growlnotify acima) que consulta as entradas e renomeia o arquivo selecionado para esse novo nome. Eu não incluí o tratamento de erros e tal, por exemplo adicionar dois pontos e barras ao novo nome do arquivo provavelmente quebrará o script.

    # repeat for every file in selection
for f in "$@"
do
    # capture input of a simple dialog in AppleScript
    OUT=$( osascript -e "tell application \"System Events\" to text returned of (display dialog \"New Name of $f:\" default answer \"\")" )
    # if the user canceled, skip to the next file
    [[ $? -eq 0 ]] || continue
    # old file name is the loop variable
    OLD="$f"
    # new file name is the same directory, plus the user's input
    NEW="$( dirname "$OLD" )/$OUT"
    # print a message announcing the rename
    /usr/local/bin/growlnotify "Renaming…" -m "$OLD to $NEW"
    # perform the actual rename
    mv "$OLD" "$NEW"
done

Captura de tela de uma ação de renomeação de amostra anunciada por meio de growlnotify :

enter image description here

    
por 31.12.2011 / 14:53