Pasar mayúsculas a minúsculas solo en contenido de archivos de texto [Solucionado]
Hola, les cuento como viene la mano...
Me había bajado de internet un juego de pelea hecho con M.U.G.E.N. que corriéndolo con wine anda bastante bien. Pero yo quería ir más lejos y correrlo con el M.U.G.E.N. nativo en Linux. Para el que no conozca M.U.G.E.N. es un motor de juegos de lucha 2d, consta de un ejecutable (siempre el mismo) y de una estructura de directorios y archivos con un determinado formato. La gente puede poner en ciertas carpetas configuración y sprites personajes, escenarios, etc... y al correr el ejecutable se tiene un juego de lucha 2d customizado... Yo no me he puesto a ver como es toda la sintaxis ni que hace cada archivo de configuración, pero lo que si tengo claro (en parte por los mensajes de error) es que la versión para Linux es case-sensitive y tiene problema cuando hay que cargar archivos con mayúsculas y minúsculas distintas a las que aparecen en todos los archivos de configuración o predeterminados...
La verdad que no se mucho de comandos, scripts ni nada, y lo que suelo hacer en buscar en internet, adaptar y tratar de comprender a posteriori comandos que hagan algo que me interesa hacer...
Para intentar solucionar el problema de la case-sensitve mi primer impulso fue renombrar todos los archivos y directorios pasándolos a minúsculas:
find ./ -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;
El problema es convertir el contenido de los archivos de configuración, cuando hacen referencia a un archivo dado usando mayúsculas y minúsculas en forma caprichosa.
Para remplazar el contenido de un archivo de mayúscula a minúscula:
$ tr '[:upper:]' '[:lower:]' < input_file > output_file
Para remplazar contenidos de mayúscula a minúscula de todos los archivos en un directorio (Lo coloca en una carpeta llamada NUEVO, previamente creada):
$ for i in `ls -l | awk '{print $9}'`; do tr '[:upper:]' '[:lower:]' < $i > ../NUEVO/$i; done
Esto tiene problema con los espacios ya que luego de un espacio se supone que viene el argumento 10mo de la salida del 'ls -l', y no que es parte del argumento 9no (fijado por $9)...
Pero además hay un problema adicional: Archivos de imagen y sonido u otro tipo que no sean de configuración no deberían ser modificados de esta forma por que se corrompería la información... Osea en realidad solo querría modificar (y en la misma ubicación) el contenido de archivos de texto que usualmente uno abriría con 'leafpad'...
Ahora bien, no me puse a estudiar sobre toda la configuración del M.U.G.E.N. ni me interesa hacerlo, así que no se bien cuales archivos debo modificar, quería hacerlo en forma masiva y recursiva, siempre que fuera posible de alguna manera determinar si un archivo es "editable con un procesador de texto". Sospecho que sí debe ser posible por que el comando 'file' parece leer algún tipo de encabezado (¿o algo por el estilo?) y obtiene cierta información sobre el contenido de los archivos...
En resumen: Me interesaría adquirir (si alguien me lo pudiera pasar) o ayuda para hacer un línea de comando o un script que recursivamente identificara ÚNICAMENTE archivos de texto y dentro de los mismos editara de mayúsculas a minúsculas. Además que no tuviese problemas con los espacios en los paths y nombres (que no tome las separaciones como fines de cadena)...
Por supuesto que siempre lo mejor sería ponerse a estudiar "vida y obra de comandos y scripts", todos sobre manipulación de cadenas y todo sobre la configuración de M.U.G.E.N. ... Pero quizás se podría cortar camino ya que el objetivo primario es jugar un rato con la computadora un juego de lucha para distraerse sin pensar demasiado...
Cualquiera que pueda tirarme una ayuda se lo agradezco...
- Inicie sesión o regístrese para enviar comentarios
- 1573 lecturas


podrias mostrar un archivo, para ver la cuestion de los espacios y ver como lo quieres?
podrias mostrar un archivo, para ver la cuestion de los espacios y ver como lo quieres?
No se si entiendo lo que dice... el tema de los espacios es en los nombres y los paths... cuando trabajo con cadenas toman cada espacio como una separación entre cadenas.
digo si tuviese un path como './carpeta con cosas importantes'
en realidad la cadena debería ingresarse como './carpeta\ con\ cosas\ importantes' el problema es que un resultado usando 'find' o 'ls' no le mete la barra invertida \
otros caracteres al parecer también necesitan \( o \) o \+ etc...
Además yo decía que debe haber una manera de "detectar" si es un archivo de texto (de esos que uno puede editar con el leafpad), por que el comando 'file' hace cierto tipo de reconocimiento así que debe ser posible de alguna manera... Lo que yo quiero es pasar a minúsculas el contenido de esos archivos, pero para eso el path debe funcionar bien para encontrarlos...
Gracias
Tienes que leer el fichero y la salida convertirla con tr. Algo asi
cat file | tr [A-Z] [a-z]Luego si quieres esta salida la pasas a un nuevo fichero o al mismo
Tienes que leer el fichero y la salida convertirla con tr. Algo asi
cat file | tr [A-Z] [a-z]Luego si quieres esta salida la pasas a un nuevo fichero o al mismo
Sí, gracias, lo tendré en cuenta. De todo modos ya lo hacía con esto:
$ tr '[:upper:]' '[:lower:]' < input_file > output_file(como he posteado al principio)
Pero no lo quiero hacer con cada archivo individual, quiero hacerlo con todos los archivos de texto dentro de un directorio y subdirectorios. No se como no tener problemas con las rutas que tienen espacios, ya que esas rutas las se obtener con 'ls' o 'find' pero a la hora de entrar el path tengo que preceder los espacios con una barra invertida '\'. Lo mismo con nombres de archivos que tengas ciertos caracteres especiales como signos + y paréntesis ( ) etc... Osea, no se como fabricarme un path, a partir de los obtenidos por 'ls' o 'find' que tenga resuelto todos esos caracteres conflictivos.
Además no todos los archivos son de texto. No se como hacer un script que los detecte de alguna forma y filtre a los otros. Pero el comando 'file' he visto que hace cierto tipo de interpretación de los archivos, así que debe haber una forma de darse cuenta si son de texto o no...
Esos son las dos cuestiones que tengo que resolver para poder lograr mi cometido
Gracias
Para el tema de los espacios en los nombres, mírate el manual de find, concretamente la opción -print0. La salida del comando la pasas a xargs:
man findman xargs
para reconocer archivos de texto:
man filePara el tema de los espacios en los nombres, mírate el manual de find, concretamente la opción -print0. La salida del comando la pasas a xargs:
man findman xargs
para reconocer archivos de texto:
man fileOk, aparentemente con la combinación find+xargs se soluciona eso de los espacios.
Un ejemplo tonto es este donde el comando 'ls' toma correctamente el nombre del path y lo "listea" (osea lo imprime):
$ find ./ -depth -print0 | xargs -0 -n 1 ls(Notar que acá se va ejecutando 'ls' para cada path, el barrido lo hace el find)
Con respecto al comando file parece que 'file -b NOMBRE ARCHIVO' arroja el resultado que dice el tipo de archivo. Hay distintos archivos de texto pero creo que lo único que necesitaría saber es como detectar en esa salida la presencia de una sub-cadena que diga 'text'.
Otra cosa que seguro a muchos le parecerá una pavada (pero yo no escribo script o líneas largas muy a menudo) es si existe posibilidad de alguna estructura condicional tipo 'if then' o 'if do' o algo así... Voy a buscar eso en algún otro lado, por que si hago 'man if' me arroja cualquier cosa...
Gracias
Otra cosa que seguro a muchos le parecerá una pavada (pero yo no escribo script o líneas largas muy a menudo) es si existe posibilidad de alguna estructura condicional tipo 'if then' o 'if do' o algo así... Voy a buscar eso en algún otro lado, por que si hago 'man if' me arroja cualquier cosa...
Gracias
Si, if ... else ...fi
Por ejemplo aqui
http://www.freeos.com/guides/lsst/ch03sec03.html
Una solucion a la subcadena podria ser esta, si alguien tiene una mejor, porfa optimizenme :P.
if [ file "Supongamos cualquier elemento" | grep -q "test" ]#Pedimos tipo de archivo con comando file
#Vemos si tiene la subcadena test con grep (-q quiet, ver man )
then
printf " Archivo de Texto \n";
.
.
.
fi
Por lo visto si hago algo de la forma:
$ find ./ -depth -print0 | xargs -0 -n 1 ACCIONESLas ACCIONES tienen que ser varias
1- asignar a una variable (o es constante?) la cadena que xargs preparó (NO SE COMO HACERLO)
2- usar esa variable dentro del if de esta forma:
if [ file -b VARIABLE | grep -q "text" ]y usando el 'then' ejecutar la conversión de mayúsculas a minúsculas (donde se usa la VARIABLE nuevamente para indicar el archivo).
Por otro lado parece que 'xargs' no soporta más que una sola acción (no varias), así que no se como hacerle por ese lado
Gracias
EDITO:
Parece que la variable puede pasarse de esta forma
$ find ./ -depth -print0 | xargs -0 -n 1 -I CADENA ls CADENASolo restaría ver como mandar varias ordenes a la vez...
Se supone que esto debería imprimir solo los path de los archivos de texto, pero no funciona:
$ find ./ -depth -print0 | xargs -0 -n 1 -I CADENA if [ file -b CADENA | grep -q "text" ]; then echo CADENA; fibash: error sintáctico cerca del elemento inesperado `then'
Veo que los corchetes tienen problemas:
$ if [ file -b ./Leeme.txt | grep -q "text" ]; then echo "es texto"; figrep: ]: No existe el fichero o el directorio
bash: [: falta un `]'
Así funciona:
if file -b ./Leeme.txt | grep -q "text" ; then echo "es texto"; fiPero el otro comando sin corchetes sigue arrojando mismo error que antes:
$ find ./ -depth -print0 | xargs -0 -n 1 -I CADENA if file -b CADENA | grep -q "text" ; then echo CADENA; fibash: error sintáctico cerca del elemento inesperado `then'
Parece que ya casi está la cosa, si alguien se da cuenta cual es el problema de sintaxis, por favor señalelo
Gracias