Como executar um script de shell com arquivos / pastas selecionados no localizador?

13

Eu sou do Linux, onde é fácil executar um script em um conjunto de arquivos no nautilus ou dolphin, mas fiquei surpreso ao ver que isso não é fácil no OSX.

De preferência, eu adoraria poder clicar com o botão direito do mouse em alguma seleção no localizador, escolher meu script e exibir uma janela do terminal para mostrar o progresso ou qualquer interação do usuário.

Jeremy Cantrell
fonte

Respostas:

8

A maneira mais fácil e integrada de fazer isso é arrastar os itens do Finder para uma janela do Terminal . Quando você os solta, o Terminal “digita” seus nomes de caminho (escapados). Você pode usar a edição de linha de comando do seu shell para inserir o restante do comando. Ou, se estiver pensando no futuro, digite o comando primeiro e depois arraste os itens.

A versão "arrastar primeiro":

  1. Selecione e arraste alguns itens do Finder para uma janela do Terminal que esteja mostrando um prompt de shell. O terminal inserirá os nomes de caminho (com escape).
  2. Digite Control+ A(vá para o início da linha; ⌃A é o padrão, mas varia de acordo com o shell / configuração).
  3. Digite seu comando e um espaço (ele será inserido antes dos nomes dos caminhos).

A versão "pensando à frente":

  1. Em qualquer ordem, faça os dois:
    • Em uma janela do Terminal , digite a parte inicial do seu comando e espaço (tudo, exceto os nomes de caminho).
    • Selecione alguns itens no Finder .
  2. Arraste os itens selecionados do Finder para a janela Terminal onde você digitou o comando.
  3. Ative a janela Terminal e pressione Return.

Você pode (como outras respostas indicaram) recorrer ao AppleScript ou Automator se precisar de uma solução mais automatizada. Como as “partes móveis” extras podem adicionar alguma complexidade à solução, você terá que ponderar os benefícios do processo acima (manual, mas flexível) contra a complexidade da implementação de uma ou mais das soluções automatizadas.

Algumas das possibilidades de automação incluem:

  • um aplicativo de gota AppleScript
  • um programa AppleScript simples iniciado pelo menu de scripts embutido ou outro iniciador
    • obter nomes de caminho da seleção do Finder
  • um fluxo de trabalho do Automator, aplicativo ou plug-in do Finder
  • um .commandarquivo executável (geralmente um script de shell; abra no Finder para executá-lo no Terminal )
    • obter nomes de caminho da seleção do Finder (via osascript )
  • alguma ferramenta de terceiros que já fornece a funcionalidade necessária
Chris Johnsen
fonte
7

Eu não acho que exista uma maneira de fazer isso diretamente. Você pode criar um aplicativo "Automator" que fará parte do que você está procurando. Isso mostra como seria a pilha do Automator:

insira a descrição da imagem aqui

Salve o resultado como um aplicativo e, no localizador, selecione os arquivos, clique com o botão direito do mouse e selecione "Abrir com" e escolha seu aplicativo. (Pode ser necessário selecionar "Outros ..." na parte inferior da lista de aplicativos.)

Você não consegue interagir com o script com esse método, mas pode fazer um loop sobre os arquivos para executar algum shell script.

Peter Murray
fonte
É ainda mais fácil se você arrastar os arquivos sobre o ícone do aplicativo e soltá-los.
precisa saber é o seguinte
5

Os serviços são como o lida com esse tipo de coisa.

Sob o menu do aplicativo (neste caso, 'Finder'), existe (quase) sempre uma Servicesopção de menu que fornecerá serviços que se aplicam ao aplicativo atual e seu estado atual. Normalmente, o estado é o tipo de objeto selecionado (texto, arquivos / pastas, etc.).

Eles podem ser ativados, desativados e atribuídos atalhos de teclado no painel Preferências do sistema, que só faz sentido para o último dos três Keyboard.

atalhos do teclado

Para criar um serviço que aplique um script de shell a arquivos / pastas no Finder:

Inicie o e faça um novo Servicetipo de documento.

Novo Serviço

  • defina o tipo de objeto ao qual o Serviço se aplica ( files or folders)
  • definir o aplicativo no qual o serviço está disponível ( )
    • Alternativamente, há uma Get Selected Finder Itemsação.
  • adicione uma ação de Run Shell Script
  • decida se você deseja a entrada como argumentos ou

Deve ser algo como isto:

exemplo de script shell

colocará automaticamente em sua ~/Library/Servicespasta quando você salvar, o que o tornará disponível (quase) imediatamente via Application -> Servicesmenu ou no menu contextual (clique com o botão direito do mouse).

pastas de teste

documento TextEdit resultante

Lago
fonte
1

No Mac OS X, o idioma preferido do script é Applescript. Você pode criar um droplet (um script que fará algo quando você soltar alguns arquivos sobre o ícone), colocar o ícone do script (que pode ser salvo como aplicativo) na área de trabalho e arrastar e soltar os arquivos que deseja passar para o roteiro.

Como alternativa, você pode usar ações de pasta. É possível associar um script Applescript a uma pasta que será executada sempre que alguns arquivos (ou diretórios) forem descartados sobre a pasta.

kiamlaluno
fonte
1

Eu também queria fazer isso, mas, diferentemente das soluções acima, eu queria produzir parâmetros citados para um script de shell. Esses outros métodos são bons, mas são como sugerir "apenas comando-v no terminal" quando o que você realmente deseja é pbpaste.

Eu queria criar uma função de shell que eu possa usar em meus scripts que se expandissem para parâmetros de arquivo para cada seleção do Finder. Eu uso a casca de peixe e isso parece funcionar um pouco:

function selection
    osascript -e "tell application \"Finder\" to set s to the selection as alias list" -e "repeat with f in s" -e "set contents of f to POSIX path of f" -e "end repeat" -e "set AppleScript's text item delimiters to linefeed" -e "s as string"
end

Usado (novamente na casca do peixe) como convert-video (selection).

Em uma função bash, pode ser necessário citar a saída com algo como | tr '\n' '\0' | xargs -0 printf "%q" {}no final desse comando osascript, não tenho certeza.

(nota: tudo o que eu sei sobre scripts avançados de maçãs e shell aprendi nas últimas 2 horas e esquecerei amanhã)

Pierre Houston
fonte
Estava tentando fazer isso no bash recentemente, falhei, perguntei aqui superuser.com/questions/1353966 , obtive respostas que indicam: não, não é possível: ^ (Bash você perde, vou mudar para shell de peixe no meu trabalho Mac também. Nota que eu faço usar o truque de arrastar a-finder mencionado por Chris Johnsen acima, muito.
Pierre Houston
1

Com base nas respostas acima, eu construí essa coisa

https://github.com/commonpike/DropShell

Basicamente, um aplicativo AppleScript que chama um shellfile localizado no aplicativo com os arquivos descartados como argumentos. Você pode modificar o script de shell conforme necessário.

commonpike
fonte
0

Com base na resposta do commonpike, criei um AppleScript, que redireciona todos os arquivos soltos nele, para um script de shell com o nome correspondente. Simplesmente salve como aplicativo no ScriptEditor da Apple e renomeie como script.app para corresponder ao seu script.sh https://github.com/PHolker/scripts/blob/master/DropScript.scpt

PHolker
fonte