0 votos

Automator Cambiar al directorio de los archivos eliminados antes de ejecutar el comando Shell

Parece extremadamente sencillo, pero no consigo descifrarlo...

Quiero ser capaz de cambiar al directorio (carpeta) donde se encuentra el archivo caído antes de ejecutar mi shell script en ese archivo.

Así que o bien cambio al directorio primero con Automator, luego paso ese argumento a Shell script o Applescript

o cambio al directorio dentro de Applescript o Shell antes de ejecutar mi comando Shell. pls ayuda

1 votos

Envíe su respuesta a continuación. Me alegro de que funcione.

0 votos

Tal y como está codificada, la solución que has publicado como parte de tu pregunta, que en realidad debería haberse publicado como una respuesta independiente y no como una edición de la pregunta, fallará con, por ejemplo No se puede obtener la ruta POSIX de {alias "...", alias "..."} si se elimina más de un archivo. Utilice item 1 of input para actuar sólo sobre el primer archivo eliminado o utilizar un bucle de repetición. También es necesario entrecomillar correctamente las variables para evitar el globbing y la división de palabras. El código actual falla si el archivo eliminado tiene espacios en cualquier parte de su nombre de ruta completo. También es necesario utilizar Fold's quoted form por la misma razón.

1voto

moodforaday Puntos 2633

Esto es muy fácil en zsh . Puede utilizar el :h a una variable para hacer referencia al head de su ruta completa:

#!/usr/bin/env zsh -f

PATH="/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin"

for i in "$@"
do

    FILE="$i"

    cd "$FILE:h"

    # do other things here

done

En un caparazón como bash tendría que utilizar la función dirname mando:

#!/usr/bin/env bash

PATH="/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin"

for i in "$@"
do

    FILE="$i"

    DIR=$(dirname "$FILE")

    cd "$DIR"

    # do other things here

done

0 votos

Ah. No había pensado en eso. He hecho cambios para manejar múltiples archivos con el for i bucle.

0 votos

Bonita manera de hacerlo.

0 votos

Realmente no necesita el FILE y DIR como i puede utilizarse directamente, por ejemplo for i in "$@"; do cd "$i:h"; done para zsh y for i in "$@"; do cd "$(dirname "$i")"; done para bash . También utilizaría la gestión de errores, por ejemplo". cd "$(dirname "$i")" || exit

0voto

joeo Puntos 251

[Código de trabajo final]

Esta es la función que toma como argumento la ruta completa del archivo, abre Terminal y ejecuta un script bash.

El script define la función pathname y folder y, a continuación, cambia a las variables folder llama a una función externa "fds" y le pasa el archivo pathname argumento para ello.

Una vez más, gracias por todos los comentarios, especialmente al usuario3439894, ya que su sugerencia ha dado en el clavo.

on process_fds(fdsFile)
    set Fold to POSIX path of fdsFile
    tell application "Terminal"
        activate
        do script "pathname=" & Fold's quoted form & ";folder=\"$(dirname \"$pathname\")\";cd \"$folder\";fds \"$pathname\""
    end tell
end process_fds

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X