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!