Acción de Automator no suministrada con los datos requeridos

Estoy tratando de hacer lo siguiente en un flujo de trabajo de Automator:

  1. Solicitar elementos del Finder de la carpeta A
  2. En la carpeta A, agregue un sufijo a los nombres de archivo
  3. Copiarlos a la carpeta B
  4. En la carpeta B, con un AppleScript, divida el nombre del archivo por un delimitador y luego cambie el nombre del archivo con la segunda mitad del texto dividido
  5. En la carpeta B, agregue un prefijo a los nombres de archivo
  6. En la carpeta B, agregue un sufijo a los nombres de archivo

Aquí hay una muestra de los nombres de archivo que estoy tratando de renombrar:

  • un nuevo archivo$SG789.jpg
  • archivo_2$123-456.jpg
  • nombre_de_archivo$LG123.jpg
  • este_archivo$558-432.jpg

El delimitador por el que estoy dividiendo es el signo de dólar "$" para crear los siguientes archivos nuevos:

  • SG789.jpg
  • 123-456.jpg
  • LG123.jpg
  • 558-432.jpg

Estos son los formatos de nombre de archivo que me gustaría que el automatizador continuara procesando.

Gracias a otro usuario, pude llegar tan lejos. Sin embargo, mi flujo de trabajo falla en el paso 5. Recibo la siguiente advertencia:

La acción "Renombrar elementos del buscador: Agregar texto" no se proporcionó con los datos requeridos.

Aquí está la configuración del flujo de trabajo en Automator:

ingrese la descripción de la imagen aquí

Con el AppleScript a continuación:

 on run {input, parameters}
     try
        set AppleScript's text item delimiters to "$"
        set output to {}
        repeat with anItem in input
            set the end of output to text item 2 of (anItem as text)
        end repeat
        set AppleScript's text item delimiters to {}
        return output
    on error eStr number eNum
        display dialog eStr & " number " & eNum buttons {"OK"} ¬
            default button 1 with icon caution
        set AppleScript's text item delimiters to {}
        return
    end try
end run

Pensé que al devolver la salida, el siguiente flujo de trabajo continuaría con los cambios necesarios. Veo que no es así.

¿Cómo devuelvo mi salida para que el siguiente elemento del flujo de trabajo pueda usarla y continuar con el cambio de nombre del archivo?

Usted dijo: " Pensé que al devolver la salida, el siguiente flujo de trabajo se recuperaría y continuaría con los cambios requeridos. Veo que ese no es el caso ". y lo que devuelve la acción de AppleScript es solo una lista de nombres de archivo, no los nombres de ruta completos y, si bien podría modificarse para devolver el FQP, aún no funcionará con la siguiente acción porque es solo una lista de cadenas de texto, no objetos del sistema de archivos como se pasó a la acción AppleScript. En la acción de AppleScript, los FSO fueron obligados a utilizar cadenas de texto para procesarlos como elementos de texto, es decir (anItem as text), .
Usted dijo "¿ Cómo devuelvo mi salida para que el siguiente elemento de flujo de trabajo pueda usarla y continuar con el cambio de nombre del archivo? ", No sé si hay una manera de lograr lo que está tratando de hacer con la acción de AppleScript. Dicho esto, ¿por qué modifica los archivos originales antes de copiarlos? Eso simplemente no tiene sentido. Cambiaría Renombrar elementos del buscador: Agregar texto con Copiar elementos del buscador. De todos modos, no me queda claro por qué estás pasando por tantos pasos diferentes si todo lo que intentas hacer es cambiar el nombre de un archivo, por ejemplo, a new file$SG789.jpga SG789.jpg.
Probablemente optaría por hacer esto con un script bash, en mi opinión, sería mucho más fácil y eficiente. Otra opción es obtener los FSO, pasarlos a la acción de AppleScript y hacer todo lo que se debe hacer mediante programación con los FSO dentro del código AppleScript . (Lo que, por supuesto, requerirá codificación adicional).
@ user3439894 Gracias por la explicación. Que tiene sentido.
@user3439894 La razón por la que estoy modificando los originales es porque necesito mantener un registro de qué archivos se procesaron, ya que mi flujo de trabajo elimina el nombre y solo deja lo que parecen caracteres aleatorios. Si tiene una sugerencia alternativa para realizar un seguimiento de los archivos originales ya procesados, estoy abierto a sugerencias.
No sé si vio o no la respuesta que publiqué originalmente, sin embargo, la actualicé, agregué un código actualizado para la acción Ejecutar script de shell en el flujo de trabajo original de Automator y agregué un segundo flujo de trabajo de Automator. Simplemente lea la sección en Actualización: Nuevo código para la acción Ejecutar script de Shell : y también debajo del Flujo de trabajo de Second Automator para obtener más detalles.

Respuestas (1)

Todavía no está del todo claro qué es lo que está tratando de lograr, sin embargo, aquí hay un flujo de trabajo de ejemplo que puede resultarle útil.

Primer flujo de trabajo de Automator

  • Dividido en dos segmentos de trabajo:

Primer segmento:

  • Solicitar elementos del buscador
  • Cambiar el nombre de los elementos del buscador: agregar texto
  • Copiar elementos del buscador
  • Ejecutar script de shell
    • Configuraciones: Shell: bin/bash y Pass input: como argumentos
      • Reemplace el código predeterminado con el código a continuación.
      • Esto es lo que se usa para eliminar hasta e incluir $ en el nombre base del nombre de archivo .

Código para la acción Ejecutar script de Shell :

cd "$(dirname "$1")"
for f in "$@"
do
    mv "$(basename "$f")" "$(printf "$(basename "$f")" | sed -E 's/^.*\$//')"
done
echo "$(ls -1)"
  • Nota: El echo "$(ls -1)" comando no es realmente necesario en este caso de uso y se usó en este ejemplo solo para mostrar que los nombres de los archivos se cambiaron y mostrar eso en el panel Resultados .

  • Actualización: nuevo código para la acción Ejecutar secuencia de comandos de Shell : utilice este código en lugar del código original anterior. Lo he modificado para que sea un poco más eficiente tener que llamar una vez, en lugar de dos veces. (No actualicé el código en la acción Ejecutar script de Shell en la imagen original a continuación).

    basename

    cd "$(dirname "$1")"
    for f in "$@"; do
        n="$(basename "$f")"
        mv "$n" "$(printf "$n" | sed -E 's/^.*\$//')"
    done
    echo "$(ls -1)"
    
  • Nota: Consulte también el segundo flujo de trabajo de Automator , que se muestra después de la imagen original a continuación, que niega la necesidad del Segundo segmento:, ya que su acción Ejecutar script de shell está codificada para manejar el cambio de nombre que tiene lugar en el segundo segmento, agregando e intercambiando por . prefix--proc-suffix


Segundo segmento:

  • Solicitar elementos del buscador
    • Opciones: [√] Ignorar la entrada de esta acción
      • Al marcar esta opción, verá, en la imagen a continuación, que hay una desconexión deseada entre la acción anterior y esta.
  • Cambiar el nombre de los elementos del buscador: agregar texto
  • Cambiar el nombre de los elementos del buscador: agregar texto

Consulte la imagen a continuación para ver otras configuraciones aplicables de las acciones de Automator , como se muestra en el OP.

Como puede ver en la imagen a continuación, todas las acciones se completaron con éxito y según lo programado, y el panel Resultados de cada acción muestra los resultados de su acción .


Primer flujo de trabajo de Automator



Segundo flujo de trabajo de Automator

Para ser utilizado en lugar del primer flujo de trabajo de Automator.

  • Solicitar elementos del buscador
  • Cambiar el nombre de los elementos del buscador: agregar texto
  • Copiar elementos del buscador
  • Ejecutar script de shell
    • Configuraciones: Shell: bin/bash y Pass input: como argumentos
      • Reemplace el código predeterminado con el código debajo de la imagen.

Segundo flujo de trabajo de Automator

  • Los resultados de las primeras tres acciones en este segundo flujo de trabajo de Automator son exactamente los mismos que se muestran en el primer flujo de trabajo anterior, por lo tanto, dejé el panel Resultados oculto para estas acciones . Sin embargo, el panel Resultados de la acción Ejecutar script de shell muestra los resultados deseados.

Código para la acción Ejecutar script de Shell en el segundo flujo de trabajo de Automator:

p='prefix-'
s='-suffix'
t='-proc'

cd "$(dirname "$1")"
for f in "$@"; do
    n="$(basename "$f")"
    if [[ $n =~ ^.*\$.*${t}\.${n##*.} ]]; then
        mv "$n" "${p}$(printf "${n%.*}" | sed -E -e "s/$t/$s/" -e 's/^.*\$//').${n##*.}"
    fi
done
echo "$(ls -1)"
  • Nota de actualización: he modificado el código colocando las asignaciones de variables fuera del for ciclo , ya que ese es el único código que debe necesitar/querer modificar según sea necesario (y no es necesario que estén dentro del for ciclo ). No actualicé la imagen del flujo de trabajo de Automator para reflejar esta actualización.

Si lo necesita/desea, podría agregar un segundo segmento diferente a este segundo flujo de trabajo , pero el código en esta acción Ejecutar script de Shell elimina la necesidad de las dos acciones Renombrar elementos del buscador: Agregar texto que estaban en el segundo segmento del primero ( original), flujo de trabajo .

Nota: Actualizaré esto con una explicación de lo que está haciendo el código en la acción Ejecutar script de Shell , tan pronto como pueda.

La segunda automatización del flujo de trabajo definitivamente hace el trabajo. También veo por qué sentiste que tenía demasiados pasos, considerando que el resto del cambio de nombre podría haberse hecho en un guión. Gracias.
@Yazmin, aún no he tenido tiempo de actualizar la respuesta con una explicación de lo que está haciendo el código en el script bash , pero lo haré tan pronto como tenga la oportunidad. Baste decir que solo debería tener que modificar el valor de las tres variables p , sy tsegún sea necesario/querido. El código restante no debería necesitar ser modificado.
@Yazmin, Nota de actualización: he modificado el código , en el segundo flujo de trabajo de Automator , colocando las asignaciones de variables fuera del for bucle , ya que ese es el único código que debería necesitar/querer modificar según sea necesario (y no lo hacen necesita estar dentro del for bucle ). No actualicé la imagen del flujo de trabajo de Automator para reflejar esta actualización.