
Algo muy común en nuestras actividades diarias, sobre todo cuando usamos Linux o le andamos moviendo a servidores, es trabajar con archivos y directorios en Bash. En este post veremos los usos más comunes para crear, mover, comprobar y operar en general con archivos.
Verificar archivos y directorios
Muchas veces debemos comprobar si un archivo existe para poder continuar con la ejecución. Lo hacemos de la siguiente manera:
1 2 3 4 5 | if [ -f "datos.csv" ]; then echo "El archivo existe." else echo "El archivo no existe." fi |
El parámetro -f
nos ayuda a comprobar si un archivo existe, pero solo cuando es un archivo, si queremos comprobar si un directorio, este lo hacemos con -d
:
1 2 3 4 5 | if [ -d "directorio" ]; then echo "El directorio existe." else echo "El directorio no existe." fi |
Crear y eliminar archivos desde un script
También algo muy común es crear archivos o eliminarlos, sobre todo cuando son archivos intermedios o temporales.
Para crearlos usamos el comando touch
:
1 2 3 4 5 | # Crear un archivo vacío touch archivo_vacio.csv # Crear un archivo con contenido echo "Mis datos nuevos" > archivo_con_datos.txt |
Nota: El operador
>
sobrescribe el contenido del archivo si existe. Si solo quieres agregar texto, usa>>
.
Eliminar un archivo:
1 | rm archivo_con_contenido.txt |
En caso de ejecutar el comando
rm archivo.txt
y el archivo no exista, nos lanzará el error “No such file or directory”, pero la ejecución no se detiene.
Para usar lo que vimos en la primera sección, vamos a verificar si el archivo existe antes de eliminarlo:
1 2 3 4 5 6 | if [ -f "archivo.txt" ]; then rm archivo.txt echo "Archivo eliminado." else echo "Archivo no encontrado." fi |
Leer y escribir en archivos
Leer líneas de un archivo
El ejemplo que usaremos ya lo vimos en otro archivo y sirve para procesar el contenido de un archivo línea por línea con un ciclo while
con read
.
1 2 3 4 5 6 | #!/bin/bash # Leer un archivo línea por línea while IFS= read -r linea; do echo "Procesando: $linea" done < datos.csv |
IFS= read -r
: Asegura que se lean las líneas tal cual, sin que Bash interprete caracteres especiales o elimine espacios.
El archivo datos.csv tiene el siguiente contenido:
1 2 3 4 | id,name,tag 1,manuel,linux 2,jesus,bash 3,karla,ciclos |
IFS significa Internal Field Separator, que nos permite cambiar el separador de los datos. Por default su valor es la coma “,” pero podemos cambiarla haciendo IFS="|"
en caso de que el separador sea un pipe
.
Escribir en un archivo en Bash
Como vimos, escribir contenido en un archivo es simple, pero en la vida real es algo más complejo y podemos hacerlo de manera dinámica.
1 2 3 4 5 6 7 8 9 10 11 12 | #!/bin/bash archivo="datos.txt" # sobreescribir datos en un archivo echo "$RANDOM" > $archivo whoami >> $archivo echo "$(date)" >> $archivo echo "mis datos random" >> $archivo echo "Informe guardado en $archivo." |
Este script genera un archivo con algunos datos que salen de comandos como whoami
o con variables como $(date)
que son enviadas al archivo.
Mover y renombrar archivos en Bash
En Linux, mover y renombrar prácticamente son la misma acción, ya que al mover archivo, lo “cambiamos” de ubicación y asignamos un nombre, renombrar es la misma acción solamente que en el mismo directorio.
Mover un archivo en Bash
1 2 3 4 | if [ -f "datos.txt" ]; then mv datos.txt respaldo/datos.txt echo "Archivo movido a la carpeta respaldo." fi |
En este ejemplo, movemos el archivo datos.txt
al directorio respaldo
con el mismo nombre.
Renombrar un archivo en Bash
1 | mv archivo.txt nuevo_nombre.txt |
Puedes renombrar archivos con nombre cuya fuente son variables o incluso una variable:
1 2 | nuevo_nombre="archivo_$(date +%Y%m%d).txt" mv archivo.txt $nuevo_nombre |
En nuevo_nombre
juntamos archivo_
con la fecha actual.
Trabajar con directorios
Crear directorios si no existen
Al igual que las otras operaciones, podemos hacer combinaciones con los operadores y condicionales.
1 2 3 4 5 6 | if [ ! -d "nueva_carpeta" ]; then mkdir nueva_carpeta echo "Directorio creado." else echo "El directorio ya existe." fi |
[ ! -d ... ]
: comprueba si el directorio no existe antes de crearlo.
Eliminar directorios y su contenido
Para eliminar un directorio y todo su contenido, debes usar rm
con la opción recursiva -r
.
1 2 3 4 | if [ -d "nueva_carpeta" ]; then rm -r nueva_carpeta echo "Directorio y su contenido eliminados." fi |
Procesar archivos en un directorio
Muchas veces es necesario aplicar operaciones a varios archivos dentro de un directorio. Esto se puede hacer fácilmente usando un bucle for
.
Renombrar archivos en un directorio
1 2 3 4 5 6 7 | #!/bin/bash for archivo in *.txt; do nuevo_nombre="proc_$archivo" mv "$archivo" "$nuevo_nombre" echo "Archivo $archivo renombrado a $nuevo_nombre." done |
Este script procesa todos los archivos .txt
en el directorio actual y añade el prefijo proc_
a cada archivo que coincida con el patrón.
Comprimir archivos
Ya en el post del comando tar vimos como empaquetar archivos, que es algo muy común cuando hacemos respaldos. Adicionalmente, una vez empaquetados, se procede a comprimirlos para que no sean tan pesados al momento de enviarlos a un servicio o guardarlos en el disco duro.
1 2 3 4 5 6 | #!/bin/bash for archivo in *.tar; do gzip "$archivo" echo "$archivo comprimido." done |
Este script comprimirá todos los archivos .tar
en el directorio actual usando gzip
.
Encuentra archivos basados en criterios
El comando find
nos es muy útil cuando queremos buscar archivos y directorios con criterios específicos, y puedes integrarlo en tus scripts.
Buscar archivos modificados en los últimos 7 días
1 | find /ruta/a/directorio -type f -mtime -7 |
Esto listará todos los archivos modificados en los últimos 7 días en un directorio dado. Puedes combinar esto con comandos adicionales para realizar tareas en los archivos encontrados:
1 2 3 4 5 6 7 | #!/bin/bash # Buscar archivos modificados y moverlos for archivo in $(find /ruta/a/directorio -type f -mtime -7); do mv "$archivo" respaldo/ echo "$archivo movido a respaldo." done |
Para terminar el post solo hay que decir que el trabajo con archivos y directorios en Bash es clave para automatizar tareas y escribir scripts más útiles y avanzados.
Como estoy preparando el post del script que mencioné en el primer post de Bash. Debemos ir sumando cada cosa que vayamos aprendiendo.
¡Gracias por leer!