Ejercicio Práctico: Construyendo un Script de Limpieza de Archivos
Ahora que entiendes los diferentes métodos para eliminar elementos de arreglos de Bash, apliquemos este conocimiento a una situación práctica. Crearemos un script que ayuda a limpiar un directorio filtrando tipos de archivos específicos.
El Desafío de la Limpieza de Archivos
Imagina que tienes un directorio que contiene varios tipos de archivos (archivos de texto, imágenes, documentos) y quieres eliminar selectivamente ciertos tipos de archivos. Usaremos un arreglo de Bash para administrar estos archivos y aplicar nuestro conocimiento del filtrado de arreglos.
Paso 1: Configurar un Directorio de Prueba con Archivos de Ejemplo
Primero, creemos un directorio de prueba con algunos archivos de ejemplo. Abre tu terminal y ejecuta:
mkdir -p /home/labex/project/test_files
cd /home/labex/project/test_files
## Create some sample files
touch file1.txt file2.txt document1.pdf document2.pdf image1.jpg image2.jpg script.sh config.yaml
Verifica que los archivos se crearon:
ls -la
Deberías ver la lista de archivos de ejemplo que acabamos de crear.
Paso 2: Crear el Script de Limpieza de Archivos
Ahora, creemos nuestro script que usará operaciones de arreglos para filtrar archivos. Crea un nuevo archivo llamado cleanup_files.sh en el directorio /home/labex/project:
#!/bin/bash
## Directory to scan
target_dir=${1:-"/home/labex/project/test_files"}
## File extension to filter out
extension_to_remove=${2:-"txt"}
echo "Scanning directory: $target_dir"
echo "Will remove files with extension: $extension_to_remove"
## Change to the target directory
cd "$target_dir" || {
echo "Directory not found!"
exit 1
}
## Get all files in the directory
all_files=(*)
echo "All files: ${all_files[@]}"
## Create an array to store files to keep
declare -a files_to_keep=()
## Filter out files with the specified extension
for file in "${all_files[@]}"; do
if [[ "$file" != *.$extension_to_remove ]]; then
files_to_keep+=("$file")
fi
done
echo "Files to keep: ${files_to_keep[@]}"
## Create an array of files to remove
declare -a files_to_remove=()
for file in "${all_files[@]}"; do
if [[ "$file" == *.$extension_to_remove ]]; then
files_to_remove+=("$file")
fi
done
echo "Files that would be removed: ${files_to_remove[@]}"
## Ask for confirmation before removing
echo
echo "This script is in simulation mode and won't actually delete any files."
echo "In a real scenario, you would ask for confirmation before deletion:"
echo "read -p 'Are you sure you want to remove these files? (y/n): ' confirm"
echo "if [ \"\$confirm\" == \"y\" ]; then rm \"\${files_to_remove[@]}\"; fi"
Guarda el archivo y hazlo ejecutable:
chmod +x /home/labex/project/cleanup_files.sh
Paso 3: Ejecutar el Script de Limpieza de Archivos
Ahora, ejecutemos nuestro script para ver cómo identifica y filtra archivos:
./cleanup_files.sh
Esto debería mostrar una salida que indica qué archivos se eliminarían (aquellos con la extensión .txt).
Pruébalo con diferentes extensiones de archivo:
./cleanup_files.sh /home/labex/project/test_files pdf
Esto mostrará los archivos con la extensión .pdf como los que se eliminarían.
Paso 4: Mejorar el Script con Procesamiento por Lotes
Mejoremos nuestro script para manejar múltiples extensiones de archivo a la vez. Crea un nuevo archivo llamado advanced_cleanup.sh en el directorio /home/labex/project:
#!/bin/bash
## Directory to scan
target_dir=${1:-"/home/labex/project/test_files"}
## Default extensions to remove
extensions=("txt" "pdf")
## Override default extensions if provided as arguments
if [ $## -gt 1 ]; then
extensions=("${@:2}")
fi
echo "Scanning directory: $target_dir"
echo "Will filter files with these extensions: ${extensions[@]}"
## Change to the target directory
cd "$target_dir" || {
echo "Directory not found!"
exit 1
}
## Get all files in the directory
all_files=(*)
echo "All files: ${all_files[@]}"
## Create an array to store files to keep
declare -a files_to_keep=()
## Create an array to store files to remove
declare -a files_to_remove=()
## Process each file
for file in "${all_files[@]}"; do
## Extract the file extension
file_ext="${file##*.}"
## Check if the file extension is in our list
should_remove=false
for ext in "${extensions[@]}"; do
if [ "$file_ext" == "$ext" ]; then
should_remove=true
break
fi
done
## Add to appropriate array based on whether it should be removed
if [ "$should_remove" == true ]; then
files_to_remove+=("$file")
else
files_to_keep+=("$file")
fi
done
echo "Files to keep: ${files_to_keep[@]}"
echo "Files that would be removed: ${files_to_remove[@]}"
echo
echo "This script is in simulation mode and won't actually delete any files."
echo "In a real scenario, you would ask for confirmation before deletion."
Guarda el archivo y hazlo ejecutable:
chmod +x /home/labex/project/advanced_cleanup.sh
Ejecuta el script avanzado con diferentes combinaciones de extensiones:
./advanced_cleanup.sh /home/labex/project/test_files txt jpg
Esto identificará los archivos .txt y .jpg para su eliminación.
Entendiendo lo que Hemos Hecho
En este ejercicio práctico, hemos:
- Creado un entorno de prueba con varios tipos de archivos
- Construido un script básico que usa el filtrado de arreglos para identificar archivos con extensiones específicas
- Mejorado el script para manejar múltiples extensiones de archivo
- Demostrado cómo usar arreglos de Bash en un escenario del mundo real
Este ejemplo muestra cómo las técnicas de manipulación de arreglos que hemos aprendido se pueden aplicar a problemas prácticos, como la gestión de archivos y las tareas de limpieza. La capacidad de filtrar arreglos es una herramienta poderosa en tu kit de herramientas de scripting de Bash.