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

3

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

Con la ayuda de las respuestas en services - Automator Obtenga el nombre de archivo del archivo seleccionado - Preguntar diferente , configuro El servicio recibe seleccionado: 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 f.new recién creado en el Finder. Supongo que he configurado mal la ruta de salida. Pero no sé cuál es la forma correcta de arreglarlo.

    
pregunta jackxujh 02.12.2017 - 19:57

1 respuesta

3

Cambiar:

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

Para:

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 establezca Pasar entrada: en como argumentos en Ejecutar script de shell acción .

Para abordar el comentario hecho por Gordon Davisson para manejar un filename sin extension , modifiqué el código en mi respuesta anterior.

El código prueba la parte de filename de la ruta de acceso completa que se pasa a la secuencia de comandos de venta action usando un regex para ver si tiene una extensión, o más literalmente un . como parte del filename , y si no hay . en el nombre de archivo procesa el if branch , de lo contrario procesa el else branch .

También tenga en cuenta que usar un glob en lugar de un regex , por ejemplo:

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

También funcionaría para probar una extensión. De cualquier manera, el nuevo nombre de ruta completo seguirá adecuadamente uno de estos dos ejemplos:

  • /path/to/filename se convierte en: /path/to/filename-new
  • /path/to/filename.ext se convierte en: /path/to/filename-new.ext

Nota: esta respuesta asume que las rutas de acceso completas no contienen caracteres nulos ni retornos de carro ni líneas de alimentación. IMO Proper pathnames no contiene tales caracteres y no los probaré.

    
respondido por el user3439894 02.12.2017 - 20:07

Lea otras preguntas en las etiquetas