¿Cómo ejecutar un script de shell con archivos / carpetas seleccionados en el buscador?

13

Vengo de Linux, donde es fácil ejecutar un script contra un conjunto de archivos en nautilus o dolphin, pero me sorprendió ver que esto no es fácil en OSX.

Preferiblemente, me encantaría poder hacer ctrl-clic en alguna selección en el buscador, elegir mi script y tener una ventana de terminal emergente para mostrar el progreso o cualquier interacción del usuario.

Jeremy Cantrell
fuente

Respuestas:

8

La forma más fácil e integrada de hacer esto es simplemente arrastrar los elementos desde Finder a una ventana de Terminal . Cuando los suelte, la Terminal "tecleará" sus nombres de ruta (escapados). Luego puede usar la edición de línea de comando de su shell para ingresar el resto del comando. O si está pensando en el futuro, puede escribir el comando primero y luego arrastrar los elementos.

La versión "arrastrar primero":

  1. Seleccione y arrastre algunos elementos del Finder a una ventana de Terminal que muestre un indicador de shell. El terminal insertará los nombres de ruta (escapados).
  2. Escriba Control+ A(vaya al comienzo de la línea; ⌃A es el valor predeterminado, pero varía según el shell / configuración).
  3. Escriba su comando y un espacio (se insertará antes de los nombres de ruta).

La versión "pensando en el futuro":

  1. En cualquier orden, haga ambas cosas:
    • En una ventana de Terminal , escriba la parte inicial de su comando y espacio (todo excepto los nombres de ruta).
    • Seleccione algunos elementos en Finder .
  2. Arrastre los elementos seleccionados desde Finder a la ventana de Terminal donde escribió el comando.
  3. Active la ventana Terminal y presione Return.

Puede (como lo han indicado otras respuestas) recurrir a AppleScript o Automator si necesita una solución más automatizada. Dado que las "partes móviles" adicionales pueden agregar cierta complejidad a la solución, tendrá que sopesar los beneficios del proceso anterior (manual, pero flexible) frente a la complejidad de implementar una o más de las soluciones automatizadas.

Algunas de las posibilidades de automatización incluyen:

  • una aplicación de gotas AppleScript
  • un programa AppleScript simple lanzado por el menú de script incorporado u otro iniciador
    • obtener nombres de ruta de la selección del Finder
  • un Automator flujo de trabajo, la aplicación o Buscador de plug-in
  • un .commandarchivo ejecutable (generalmente un script de shell; ábralo en Finder para ejecutarlo en Terminal )
    • obtener nombres de ruta de la selección del Finder (a través de osascript )
  • alguna herramienta de terceros que ya proporciona la funcionalidad que necesita
Chris Johnsen
fuente
7

No creo que haya una manera de hacer esto directamente. Puede crear una aplicación "Automator" que haga algo de lo que está buscando. Esto muestra cómo se vería la pila Automator:

ingrese la descripción de la imagen aquí

Guarde el resultado como una Aplicación, luego en el buscador seleccione los archivos, haga clic derecho y seleccione "Abrir con" y luego elija su aplicación. (Es posible que deba seleccionar "Otro ..." en la parte inferior de la lista de aplicaciones).

No puede interactuar con el script con este método, pero puede recorrer los archivos para ejecutar algún script de shell.

Peter Murray
fuente
Es aún más fácil si arrastra los archivos sobre el icono de la aplicación y los suelta.
kiamlaluno
5

Los servicios son cómo maneja este tipo de cosas.

Debajo del menú de la aplicación (en este caso, 'Finder') hay (casi) siempre una Servicesopción de menú que proporcionará servicios que se aplican a la aplicación actual y su estado actual. Normalmente, el estado es el tipo de objeto seleccionado (texto, archivos / carpetas, etc.).

Se pueden habilitar, deshabilitar y asignar atajos de teclado en el panel de Preferencias del Sistema que solo tiene sentido para el último de esos tres Keyboard,.

atajos de teclado

Para crear un Servicio que aplique un script de shell a archivos / carpetas en Finder:

Inicie el y cree un nuevo Servicetipo de documento.

Nuevo servicio

  • establecer el tipo de objeto al que se aplica el Servicio ( files or folders)
  • configurar la aplicación en la que está disponible el servicio ( )
    • Alternativamente hay una Get Selected Finder Itemsacción.
  • agregar una acción de Run Shell Script
  • decida si desea la entrada como argumentos o

Debería verse más o menos así:

ejemplo de script de shell

colocará automáticamente en su ~/Library/Servicescarpeta cuando guarde, lo que lo hará disponible (casi) inmediatamente a través del Application -> Servicesmenú o el menú contextual (clic derecho).

carpetas de prueba

documento TextEdit resultante

lago
fuente
1

En Mac OS X, el lenguaje de script preferido es Applescript. Puede crear una gota (una secuencia de comandos que hará algo cuando coloque algunos archivos sobre su icono), coloque el icono de la secuencia de comandos (que se puede guardar como aplicación) sobre el escritorio y arrastre y suelte los archivos que desea pasar al guión.

Como alternativa, puede usar acciones de carpeta. Es posible asociar un script Applescript a una carpeta que se ejecutará todas las veces que algunos archivos (o directorios) se suelten sobre la carpeta.

kiamlaluno
fuente
1

También he querido hacer eso, sin embargo, a diferencia de las soluciones anteriores, quería producir parámetros citados para un script de shell. Esos otros métodos están bien, pero son como sugerir "simplemente comando-v en la terminal" cuando lo que realmente quieres es pbpaste.

Quería hacer una función de shell que pueda usar en mis scripts que se expandió a los parámetros de archivo para cada selección de Finder. Yo uso la concha de pescado y esto parece funcionar de alguna manera:

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 (nuevamente en la concha de pescado) como convert-video (selection).

En una función bash, es posible que deba citar la salida con algo así como | tr '\n' '\0' | xargs -0 printf "%q" {}al final de ese comando osascript, no estoy seguro.

(nota: todo lo que sé sobre el script avanzado de AppleScript y Shell se volvió a aprender en las últimas 2 horas y lo olvidaré mañana)

Pierre Houston
fuente
Intenté hacer esto en bash recientemente, fallé, pregunté aquí superuser.com/questions/1353966 , obtuve respuestas que indican: no, no es posible: ^ (Bash pierdes, también voy a cambiar a shell de pescado en mi Mac de trabajo). que sí uso bastante el truco de arrastrar hasta el buscador mencionado por Chris Johnsen anteriormente.
Pierre Houston
1

Basado en las respuestas anteriores, construí esta cosita

https://github.com/commonpike/DropShell

Básicamente, una aplicación de AppleScript que llama a un archivo shell ubicado en la aplicación con los archivos descartados como argumentos. Puede modificar el script de shell según sea necesario.

Pico común
fuente
0

Basado en la respuesta de commonpike, he creado un AppleScript, que redirige todos los archivos que se le han caído, a un script de shell con el nombre correspondiente. Simplemente guarde como aplicación desde ScriptEditor de Apple y cambie el nombre como script.app para que coincida con su script.sh https://github.com/PHolker/scripts/blob/master/DropScript.scpt

PHolker
fuente