txt texto subtitulos saber online formato convertir convertidor como codificacion cambiar bom archivos archivo macos shell encoding glob iconv

macos - texto - osx cambiar la codificacion de archivos(iconv) recursiva



convertir subtitulos a unicode (7)

Sé que puedo convertir una sola codificación de archivo bajo OSX usando:

iconv -f ISO-8859-1 -t UTF-8 myfilename.xxx > myfilename-utf8.xxx

Tengo que convertir un montón de archivos con una extensión específica, por lo que quiero convertir la codificación de archivos de ISO-8859-1 a UTF-8 para todos los archivos * .ext en la carpeta / mydisk / myfolder

Quizás alguien sepa la sintaxis de cómo hacer esto.

Gracias

ekke


Aquí está el ejemplo Probado en mac 10.10. Encuentre el archivo por su nombre, convierta la codificación, luego reemplace el archivo original.trabajo perfecto. Gracias por el ejemplo de Roman Truba, COPIE el código completo a continuación a su shell script.

#!/bin/bash find ./ -name *.java -type f | / (while read file; do if [[ "$file" != *.DS_Store* ]]; then if [[ "$file" != *-utf8* ]]; then iconv -f ISO-8859-1 -t UTF-8 "$file" > "$file-utf8"; rm $file; echo mv "$file-utf8" "$file"; mv "$file-utf8" "$file"; fi fi done);


El comentario de Adam me mostró la manera de resolverlo, pero esta fue la única sintaxis con la que funcionó:

find /mydisk/myfolder -name /*.xxx -type f | / (while read file; do iconv -f ISO-8859-1 -t UTF-8 "$file" > "${file%.xxx}-utf8.xxx"; done);

-i ... -o ... no funciona, pero>

gracias de nuevo

ekke


Extendí el guión de Albert.Qings:

  • autodetecta la codificación del archivo actual
  • añadido un parámetro de comando para hacer un run / exec-run
  • Se agregó un parámetro para el directorio y el patrón de nombre de archivo.

    #!/bin/bash command=${1-"usage"} searchPattern=${2-"*.java"} searchDirectory=${3-"."} if [[ "$command" == "usage" ]]; then echo "convert-file-to-utf8.sh [usage|dry|exec] [searchPattern=$searchPattern] [searchDirectory=$searchDirectory]" exit fi find $searchDirectory -type f -name "$searchPattern" | / (while read file; do if [[ "$file" != *.DS_Store* ]]; then if [[ "$file" != *-utf8* ]]; then currentEncoding="$(file --brief --mime-encoding $file)" if [[ "$currentEncoding" != "utf-8" ]]; then echo "command:$command / iconv -f $currentEncoding -t UTF-8 $file" if [[ "$command" == "exec" ]]; then iconv -f $currentEncoding -t UTF-8 "$file" > "$file-utf8"; rm $file; echo mv "$file-utf8" "$file"; mv "$file-utf8" "$file"; fi fi fi fi done);

Probado en MacOS X 10.12.6 / Sierra.


Prueba esto ... está probado y funciona:

Primer paso (ICONV): encuentra / var / www / -name * .php -type f | (mientras lee el archivo; haga iconv -f ISO-8859-2 -t UTF-8 "$ file"> "$ {file% .php} .phpnew"; listo)

Segundo paso (REESCRIBIR - MV): encuentra / var / www / -name "* .phpnew" -type f | (mientras lee el archivo; haga mv $ file echo $file | sed ''s//(.*/./)phpnew//1php/'' ; done)

Es sólo una conclusión sobre mi investigación :)

Espero que ayude a Jakub Rulec


Puede escribir un script en cualquier lenguaje de scripting para iterar sobre cada archivo en / mydisk / myfolder, verificar la extensión con la expresión regular [. (. *) $], Y si es "ext", ejecute el siguiente (o equivalente) desde una llamada al sistema.

"iconv -f ISO-8859-1 -t UTF-8" + file.getName () + ">" + file.getName () + "-utf8.xxx"

Esto solo sería unas pocas líneas en Python, pero lo dejo como un ejercicio para que el lector revise los aspectos específicos de la búsqueda de iteración de directorios y expresiones regulares.


Si quieres hacerlo recursivamente, puedes usar find(1) :

find /mydisk/myfolder -name /*.xxx -type f | / (while read file; do iconv -f ISO-8859-1 -t UTF-8 -i "$file" -o "${file%.xxx}-utf8.xxx done)

Tenga en cuenta que he utilizado | while read | while read lugar de la opción -exec de buscar (o canalizar a xargs ) debido a las manipulaciones que necesitamos hacer con el nombre de archivo, es decir, cortar la extensión .xxx (usando ${file%.xxx} ) y agregar -utf8.xxx .


Si tu shell es bash, algo como esto

for files in /mydisk/myfolder/*.xxx do iconv -f ISO-8859-1 -t UTF-8 "$files" "${files%.xxx}-utf8.xxx" done