LinuxParty
[Actualización 2022-04-11 - 10:00 ]
Cambiar el contenido de muchos archivos a la vez puede ser una operación tediosa en algunos sistemas operativos, no sé... se me ocurre Windows por ejemplo. Pero en Linux y sus primos hermanos, es algo sencillo, siempre que sepas como hacerlo y desde estas línesa te queremos enseñar a hacerlo.
Muy util para cambiar por ejemplo una IP dentro de un montón de archivos de configuración, o para los programadores, cambiar el nombre de una función en un programa que tenga centenares de líneas de código con multitud de ficheros, por ejemplo. O para cambiar el nombre de algo mal escrito para un editor, incluso teniendo para cambiar valores en sentencias SQL pasadas a texto plano.
Para este ejemplo... Resulta que tengo que cambiar el contenido de muchos ficheros a la vez, resulta que en una función de desarrollo se llama getFuncion y ahora debe llamarse getFunction, buscar y cambiar el contenido de todos esos ficheros uno a uno, llevaría muchísimo tiempo, pero cambiar el contenido de todos esos ficheros a la vez es factible simplemente escribiendo:
find $HOME/Desarrollo/MiPrograma -type f -exec sed -i s/'getFuncion'/'getFunction'/g {} \;
La sentencia de arriba busca en la ruta indicada ficheros y ejecuta y cambiara su contenido de entre de todos ellos cuando se encuentra lo que se busca, aquí establecido en color rojo a través de la sentencia "sed".
Puedes comprobar que se han hecho los cambios (o probar los cambios que vas a hacer, escribiendo...)
grep -r "getFuncion" *
Pero también, puedes utilizarlo para resolver problemas de configuración y cambiar varios ficheros a la vez, pongamos también este ejemplo:
Me ha ocurrido que tengo que cambiar la IP de todos los ficheros de configuración del directorio /etc, así pues he decidido compartir este comando para que sepáis como hacerlo.
find /etc -type f -exec sed -i s/'237.742.45.9'/'192.168.1.2'/g {} \;
Así de fácil…
Si quieres probarlo, crea en varios ficheros de texto plano, llamados "uno.txt", "dos.txt", etc... algunos textos y cambialos, por ejemplo:
La línea general como funciona es: Cambiar en todos los ficheros del directorio /etc con extensión ".txt", el texto "Pepito" por el texto "José".
find $HOME -iname *.txt -exec sed -i s/'Pepito'/'José'/g {} \;
Luego, probamos que se han hecho los cambios:
grep -r "José" *
Te recordamos que puedes cambiar la variable $HOME por ~, así, por ejemplo es lo mismo escribir $HOME/Documentos que ~/Documentos.
COMO CONTROLAR LOS CAMBIOS, A TRAVÉS DE UN SCRIPT (RECOMENDADO).
Si por alguna razón, el comando de arriba no funcionase bien, o simplemente quiere tener un control de los cambios que se van a producir y en qué ficheros... también se pueden dar estos siguientes pasos, en los que además de tener más control del proceso, a su vez se tiene un control más preciso. (Yo lo recomiendo)
1º Buscar los cambios objeto de cambio...:
grep -r "Pepito" (o grep -ir "pepito" Para no hacer diferencia entre mayúsculas y minúsculas.) *.txt
Con el trozo de código de abajo, automáticamente se irá añadiendo a un script el código a cambiar, para que luego únicamente nos baste con ejecutar el script para hacer los cambios. Para tratar de entenderlo mejor, lo hacemos con un ejemplo.
Por ejemplo, los ficheros uno.txt y dos.txt están en los directorios 1a y 1b, respectivamente. Si quisiéramos cambiar el contenido de ambos ellos, "hola" por "adiós" con el script creado para tal propósito que controle el proceso (que además, yo creo que es recomendable) podríamos hacer lo siguiente
Contenido del scrpt:
grep -ir "hola" * | awk '{print $1}' | sed s/':'/' '/g | awk '{print "sed -i \"s%hola%adiós%g\"", $1}' > acambiar.sh
Hasta la primera tubería "|", buscamos el texto cambiar y en la variable "$1" quedará almacenada la ruta y el nombre del fichero objeto de cambio, en la segunda tubería, aislamos el valor, quitamos ":" y añadimos un espacio, al contenido aislado en la primera tubería.
En la tercera y última tubería y antes de la redirección ">>", añadimos al código del script el valor de $1 que es la ruta del archivo, que lo hará en todo el fichero objeto de cambio de la búsqueda "hola", por largo que sea. Y por último redirige la salida al script que lo vamos a llamar "acambiar.sh"
El contenido del script variará dependiendo de la extensión de ficheros, nosotros hemos puesto 2 ficheros, "uno.txt" y "dos.txt", para este ejemplo.
Tras la ejecución, el script "acambiar.sh" tendrá el siguiente contenido:
sed -i "s%hola%adiós%g" 1a/uno.txt sed -i "s%hola%adiós%g" 1b/dos.txt
Luego al script le daremos permisos de ejecución.
chmod a+x acambiar.sh # Ejecutamos el script ./acambiar.sh
Y se cambia lo que quisiéramos.
-
Documentación
- Los alemanes denuncian la influencia del inglés mientras el "apóstrofe del idiota" obtiene la aprobación oficial
- Explora la Historia Hispánica con este Mapa Interactivo de la Real Academia de Historia
- ¿CÓMO SE INVENTÓ LA RUEDA?
- ¿Estamos en el 'Antropoceno', la era humana? Los científicos dicen: no
- Quemadores de Hidrógeno Verde para una Producción de Asfalto Sostenible
- Jericó: Un Viaje a Través de los Milenios en la Ciudad más Antigua del Mundo
- La Generación Z recurre a los libros y bibliotecas físicos
- El Trágico Declive de la Biblioteca de Alejandría: Una Epopeya Perdida en Llamas
- Los Neandertales fueron los primeros homínidos en controlar el fuego, y no los sapiens, sugiere un estudio
- Un grupo de Hóminidos Eurosiáticos podrían poner en duda todo lo que sebe sobre el del Homo Sapiens, hasta la fecha
- Descubre la Iglesia de San Antonio de los Alemanes: Un Tesoro Arquitectónico en el Corazón de Madrid
- La Asombrosa Reconstrucción de una Mujer Prehistórica Después de 4 Mil Años
- Descubren nuevo fósil de hace 8.7 millones de años en Turquía que desafía la historia sobre el origen de la humanidad
- Los arqueólogos descubren una lengua secreta perdida de hace 3.000 años
- La Queja Más Antigua del Mundo: La Historia Detrás de una Antigua Carta de Cliente Insatisfecho