es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Script de Bash para tomar las mismas líneas de 2 archivos diferentes.

Tengo por ejemplo un archivo llamado usuarios y contiene:

user1
user2
user3

y un archivo llamado nuevosusuarios que contiene:

newuser1
newuser2
newuser3

y ahora necesito un script bash para tomar user1 y newuser1 y hacer algún comando, por ejemplo ‘mv user1 a newuser1’ y así sucesivamente.
Algo como esto, pero no me funciona:

user=cat usuarios
newuser=cat nuevosusuarios

para u en usuario ; para n en nuevosusuarios ; hacer mv $u $n ; finalizar; finalizar

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar este script, puede utilizar un bucle while para leer ambos archivos línea por línea, y luego usar el comando mv para mover al usuario original al nuevo nombre de usuario. Aquí hay un script actualizado:

    #!/bin/bash
    
    archivo_usuarios='usuarios'
    archivo_nuevos_usuarios='nuevos_usuarios'
    
    while read -r usuario && read -r nuevo_usuario <&3; do
      mv "$usuario" "$nuevo_usuario"
    done < "$archivo_usuarios" 3< "$archivo_nuevos_usuarios"
    

    En este script, establecemos los nombres de archivo para los archivos de usuarios y nuevos usuarios como variables. Luego, usamos un bucle while para leer cada línea de ambos archivos. La sintaxis <&3 se utiliza para redirigir la entrada estándar para el comando read de la variable nuevo_usuario al descriptor de archivo 3, para que lea desde el archivo nuevos_usuarios en lugar de la entrada estándar.

    Dentro del bucle, usamos el comando mv para mover al usuario original al nuevo nombre de usuario.

    Tenga en cuenta que este script asume que el número de usuarios en el archivo usuarios es el mismo que el número de nuevos usuarios en el archivo nuevos_usuarios. Si esto no es así, es posible que desee agregar algún control de errores para manejar la inconsistencia.

Comments are closed.