8 votos

Cómo crear un servicio de Automator para ejecutar un script</strkeep><strkeep> en todos los archivos de una carpeta

Quiero crear un servicio usando Automator para ejecutar un shell script en todos los archivos de una carpeta, digamos que eliminar todos los archivos de registro. Lo que he hecho es

  1. Creé un nuevo servicio en Automator.
  2. Se ha añadido una acción "Ejecutar Shell script". Por ahora he cambiado esto por 'pwd'.
  3. Se ha seleccionado "El servicio recibe las carpetas seleccionadas".
  4. He intentado ejecutarlo, pero me sale un mensaje. "Para probar este servicio dentro de Automator, añada la acción "Obtener elementos del buscador especificados" al principio de su flujo de trabajo. Elimine o desactive la acción antes de ejecutar el flujo de trabajo fuera de Automator.
  5. BIEN. Así que añado "Obtener elementos del buscador especificados". Agrego un directorio "de prueba" a la lista de elementos.

Ahora, cuando ejecuto el script, la ventana de resultados imprime mi directorio personal.

En otro lugar, he leído que tal vez tenga que añadir

cd "$1"

al principio de mi script. Lo he hecho pero sigue imprimiendo mi directorio personal. ¿Cómo consigo que esta cosa imprima el directorio que he seleccionado en "Obtener elementos especificados del buscador"?

Editado para añadir

Aquí hay una captura de pantalla de un script que funciona.

test

Aquí hay una captura de pantalla de un script que no funciona.

enter image description here

La forma habitual de tratar el error "no match found : *.log" sería redirigir la salida de error a null. Sustituyendo la línea "rm" por

find . -name "*.log" -print0 | xargs -0 rm -rf

Sin embargo, funciona. Esto parece más difícil de lo que debería ser.

9voto

user3439894 Puntos 5883

Si está creando un Servicio utilizando RunShell script a la que se quiere pasar el Carpeta(s) a la RunShell script y que se realicen acciones adicionales en el script en ellos, entonces empieza con estos ajustes.

Crear el servicio:

  1. Abrir Automatizador y seleccione Servicio o Archivo > Nuevo > Servicio Si Automatizador ya está abierto.

  2. Establecer Servicio que recibe seleccionado a carpetas y en a Buscador .

  3. Añade un Ejecutar Shell script Acción , ajuste Shell: a /bin/bash y Pase de entrada: a
    como argumentos . Esto cambia el valor por defecto código a partir de cat a:

    for f in "$@"
    do
        echo "$f"
    done

Ahora puede utilizar $f para actuar sobre el objetivo Carpeta(s) Por ejemplo cd $f y ahora estás en el directorio de $f y puede añadir más código para actuar sobre los archivos/carpetas dentro de $f etc.

Actualización:

Utilice lo siguiente código de trabajo como ejemplo:

for d in "$@"; do
    cd "$d"
    for f in *.log; do    
        rm "$f"
    done
done

Dentro de la Prueba y Copia de prueba carpetas había una serie de .log y archivos con otras extensiones también. Cuando se ejecuta el código anterior sólo se elimina el *.log archivos dentro de las carpetas de destino, como se muestra en las imágenes siguientes, utilizando dos carpetas o una carpeta y tanto archivos como carpetas con/sin espacios en sus nombres.


enter image description here


enter image description here

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