Archivos y directorios en Bash

archivos y directorios en bash

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:

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:

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:

# 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:

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:

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.

#!/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:

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.

#!/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

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

mv archivo.txt nuevo_nombre.txt

Puedes renombrar archivos con nombre cuya fuente son variables o incluso una variable:

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.

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.

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

#!/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.

#!/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

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:

#!/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!


Posted

in

, ,

by