2 votos

Crear un servicio de conversión de codificación de texto en Automator

Estaba intentando hacer un servicio de Finder para convertir fácilmente la codificación de texto de algunos archivos. Debido a que el conjunto de caracteres por defecto para el chino simplificado en Windows es el estándar nacional chino GB18030 (no el UTF-8 utilizado en Mac).

Con ayuda de las respuestas en services - Automator Get Filename of Selected File - Ask Different, configuré Servicio recibe la selección: Archivos o carpetas en:Finder

Luego, hice este script de Shell en Automator:

for f in "$@"
do
    iconv -f gb18030 -t utf-8 f > f.new
done

Sin embargo, cuando ejecuto el servicio al seleccionar f, no veo el archivo recién creado f.new en Finder. Supongo que he configurado mal la ruta de salida. Pero no sé cuál es la forma correcta de corregirlo.

Captura de pantalla de Automator

1 votos

Para hacerlo funcionar, el input de Pase: en el procedimiento debe ser como argumentos en lugar de stdin.

0 votos

He modificado mi respuesta para abordar un comentario hecho por Gordon Davisson y sugiero que utilices la respuesta modificada en su lugar.

3voto

user3439894 Puntos 5883

Cambiar:

for f in "$@"
do
    iconv -f gb18030 -t utf-8 f > f.new
done

A:

for f in "$@"; do
    if [[ ! $(basename "$f") =~ .*\..* ]]; then
        iconv -f gb18030 -t utf-8 < "$f" > "${f}-new"
    else
        iconv -f gb18030 -t utf-8 < "$f" > "${f%.*}-new.${f##*.}"
    fi
done

Y establecer Entrada de pase: a como argumentos en la Acción Ejecutar Script de Shell.


Para abordar el comentario realizado por Gordon Davisson para manejar un nombre de archivo sin extensión, he modificado el código en mi respuesta anterior.

El código verifica la parte del nombre de archivo de la ruta de acceso completamente cualificada pasada a la Acción Ejecutar Script de Shell utilizando una expresión regular para ver si tiene una extensión, o más literalmente un . como parte del nombre de archivo, y si no hay un . en el nombre de archivo procesa la rama if, de lo contrario procesa la rama else.

También tenga en cuenta que usando un glob en lugar de una expresión regular, por ejemplo:

if [[ ! $(base name "$f") == *.* ]]; then

También funcionaría para probar si hay una extensión. De cualquier manera, la nueva ruta de acceso completamente cualificada seguirá apropiadamente uno de estos dos ejemplos:

  • /ruta/hacia/nombrearchivo se convierte en: /ruta/hacia/nombrearchivo-new
  • /ruta/hacia/nombrearchivo.ext se convierte en: /ruta/hacia/nombrearchivo-new.ext

Nota: Esta respuesta asume que las rutas de acceso completamente cualificadas no contienen caracteres nulos y/o retornos y/o saltos de línea. En mi opinión, las rutas de acceso adecuadas no contienen tales caracteres y no los comprobaré.

0 votos

@jackxujh, Actualicé mi respuesta. Parece que necesitas dirigir el archivo de entrada al comando y luego redirigir la salida al nuevo archivo. El archivo viejo y el nuevo deberían estar ahora en la misma ubicación. Además de lo que observaste en tu comentario a tu pregunta.

0 votos

Después de cambiar la configuración de pasar parámetros, la edición anterior de la respuesta (sin <) comenzó a funcionar bien. Y luego vi que añadiste la marca <. ¡Y también funciona!

0 votos

Ahora el servicio crea file.txt.new con el texto convertido codificado cuando se ejecuta, pero idealmente file-new.txt sería aún mejor. ¿Es posible también eso? ¡Gracias!

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