3 votos

Recibir varios archivos, no sólo uno, en un acceso directo en MacOS 12 Monterey

Estoy portando una acción de Automator a Shortcuts y estoy teniendo un pequeño problema. Aquí está mi acción de Automator:

oxipng Quick Action in Big Sur's Automator

El fragmento de zsh que hay dentro es:

for f in "$@"
do
    /usr/local/bin/oxipng -pD -o max "$f"
done

Esta acción de Automator me permite seleccionar un grupo de archivos PNG en Finder, hacer clic con el botón derecho del ratón sobre ellos, elegir Services oxipng -pD -o max y después de un tiempo, los archivos serán más pequeños gracias a oxipng .

Sin embargo, cuando intento portarlo a Shortcuts, estoy un poco atascado. Esto es lo que tengo hasta ahora, en un Shortcut con un nombre menos nerd, una ruta ajustada a oxipng, y algunos printfs de depuración:

oxipng with libdeflate Shortcut

Por otra parte, el Shortcut Input a la Run Shell Script la acción es Type: File , Get: File Path . Por defecto, los nombres pasados no tienen la ruta completa del archivo ni las extensiones del mismo.

Cuando ejecuto el acceso directo con una sola imagen seleccionada, todo funciona como antes. Sin embargo, si selecciono varios archivos, se me pide que elija sólo uno de ellos. El mensaje es el siguiente:

Shortcut prompting me for paths

¿Cómo puedo conseguir que mi acceso directo procese todos los archivos que le he pasado?

4voto

Nikita Puntos 354

Para evitar el procesamiento de una lista de rutas de archivos en su shell script simplemente haga un bucle sobre la entrada con Repetir con cada uno y pasar cada ruta de archivo como el argumento script con una variable Shortcuts. Cítalo para mantener los espacios y otros caracteres especiales presentes en la ruta. A screenshot of Shortcuts looping over multiple files

1voto

David Marble Puntos 111

Me encontré con el mismo problema al tratar de portar algunos scripts a Shortcuts. Es muy frustrante. I realmente Espero que haya un enfoque mejor que la solución que se me ocurrió.

Esto es lo que terminó funcionando para mí:

1. Comience con la acción "Combinar texto"

2. Haga clic con el botón derecho del ratón en "Lista de textos", pase por encima de "Seleccionar variable" y elija "Entrada de acceso directo"

3. Haga clic con el botón izquierdo del ratón en "Entrada de acceso directo" y seleccione "Ruta de archivo". 4. Asegúrese de que está seleccionada la opción "Con nuevas líneas".

Esto combinará las rutas de los archivos de entrada con nuevas líneas.

4. Convierte la entrada de nombres de archivos separados por nuevas líneas en una matriz e itera sobre ella.

Intenté algunas otras formas de combinar/reemplazar las rutas de los archivos antes del shell script (por ejemplo, enviándolas como cadenas entrecomilladas separadas por un espacio -- "archivo 1" "archivo 2") para ver si podía hacer que "$@" funcionara como lo hace normalmente, pero me rendí después de un tiempo. No importaba lo que hiciera, "$1" se veía igual que "$@". Así que terminé con algo personalizado.


Shell script

Aquí está el shell script para copiar/pegar fácilmente (debería funcionar en bash y zsh con sólo modificar el índice de FILES en el dirname para bash como se indica en los comentarios):

# Expects a file path or newline-separated list of file paths

# Change Internal Field Separator (IFS) to newline,
# convert the input file paths(s) into an array (uses IFS),
# then revert IFS
OLDIFS="$IFS"
IFS=$'\n'
FILES=($(echo $@))
IFS="$OLDIFS"

# If needed, e.g. to created a new sub-directory for output, 
# cd to the files' directory using the first item in the array
# (change index to 0 if bash -- zsh arrays start at 1)
cd "$(dirname "${FILES[1]}")"
# mkdir -p ./output # Example: create a directory for output

# Iterate over the files in the array
for FILE in "${FILES[@]}"; do
  # Do stuff with $FILE here
done

Todos juntos

Asegúrese en el Shell script de elegir "Input: Texto Combinado" y "Pasar Entrada: como argumentos"

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