Ejercicios¶
🔧 Nota: Antes de comenzar con los ejercicios, asegúrate de ejecutar el siguiente script para crear los archivos y directorios de prueba:
In [1]:
Copied!
# Crear el script bash
%%writefile setup.sh
#!/bin/bash
# Crear directorios de prueba
mkdir -p prueba/backup
mkdir -p prueba/logs
mkdir -p prueba/documentos
# Crear archivos de texto
echo "Este es un archivo de ejemplo." > prueba/documentos/archivo1.txt
echo "Otro archivo de prueba." > prueba/documentos/archivo2.txt
echo "Contiene la palabra error." > prueba/logs/log1.log
echo "Log sin errores." > prueba/logs/log2.log
echo "Más errores en el sistema." > prueba/logs/log3.log
# Crear archivos vacíos para pruebas
touch prueba/documentos/vacio.txt
touch prueba/logs/vacio.log
# Crear un archivo con varias líneas para contar
cat <<EOL > prueba/documentos/multilinea.txt
Línea 1
Línea 2
Línea 3
Línea 4
Línea 5
EOL
# Crear archivos con diferentes extensiones
touch prueba/documentos/imagen.jpg prueba/documentos/datos.csv prueba/documentos/script.sh
# Asignar permisos a uno de los archivos para probar chmod
chmod 600 prueba/documentos/archivo1.txt
# Crear un archivo para pruebas de lectura
echo "Prueba de lectura y escritura." > prueba/documentos/lectura.txt
# Crear un archivo antiguo (simulando un archivo viejo de más de 7 días)
touch -d "10 days ago" prueba/logs/antiguo.log
echo "Archivos y directorios de prueba creados exitosamente."
# Crear el script bash
%%writefile setup.sh
#!/bin/bash
# Crear directorios de prueba
mkdir -p prueba/backup
mkdir -p prueba/logs
mkdir -p prueba/documentos
# Crear archivos de texto
echo "Este es un archivo de ejemplo." > prueba/documentos/archivo1.txt
echo "Otro archivo de prueba." > prueba/documentos/archivo2.txt
echo "Contiene la palabra error." > prueba/logs/log1.log
echo "Log sin errores." > prueba/logs/log2.log
echo "Más errores en el sistema." > prueba/logs/log3.log
# Crear archivos vacíos para pruebas
touch prueba/documentos/vacio.txt
touch prueba/logs/vacio.log
# Crear un archivo con varias líneas para contar
cat < prueba/documentos/multilinea.txt
Línea 1
Línea 2
Línea 3
Línea 4
Línea 5
EOL
# Crear archivos con diferentes extensiones
touch prueba/documentos/imagen.jpg prueba/documentos/datos.csv prueba/documentos/script.sh
# Asignar permisos a uno de los archivos para probar chmod
chmod 600 prueba/documentos/archivo1.txt
# Crear un archivo para pruebas de lectura
echo "Prueba de lectura y escritura." > prueba/documentos/lectura.txt
# Crear un archivo antiguo (simulando un archivo viejo de más de 7 días)
touch -d "10 days ago" prueba/logs/antiguo.log
echo "Archivos y directorios de prueba creados exitosamente."
Writing setup.sh
In [3]:
Copied!
!chmod +x setup.sh
!./setup.sh
!chmod +x setup.sh
!./setup.sh
Archivos y directorios de prueba creados exitosamente.
Comandos Linux (CLI)¶
- Listar Archivos Detalladamente
- Objetivo: Mostrar una lista detallada de archivos, visualizando permisos, tamaños y fechas de modificación.
In [6]:
Copied!
!ls -l prueba/documentos
!ls -l prueba/documentos
total 16 -rw------- 1 root root 31 Mar 15 11:37 archivo1.txt -rw-r--r-- 1 root root 24 Mar 15 11:37 archivo2.txt -rw-r--r-- 1 root root 0 Mar 15 11:37 datos.csv -rw-r--r-- 1 root root 0 Mar 15 11:37 imagen.jpg -rw-r--r-- 1 root root 31 Mar 15 11:37 lectura.txt -rw-r--r-- 1 root root 45 Mar 15 11:37 multilinea.txt -rw-r--r-- 1 root root 0 Mar 15 11:37 script.sh -rw-r--r-- 1 root root 0 Mar 15 11:37 vacio.txt
- Buscar Archivos por Extensión
- Objetivo: Localizar todos los archivos con extensión
.txt
dentro del directorioprueba
.
- Objetivo: Localizar todos los archivos con extensión
In [7]:
Copied!
!find prueba -name "*.txt"
!find prueba -name "*.txt"
prueba/documentos/archivo1.txt prueba/documentos/multilinea.txt prueba/documentos/archivo2.txt prueba/documentos/lectura.txt prueba/documentos/vacio.txt
- Contar Líneas de un Archivo
- Objetivo: Contar cuántas líneas contiene el archivo
multilinea.txt
.
- Objetivo: Contar cuántas líneas contiene el archivo
In [8]:
Copied!
!wc -l prueba/documentos/multilinea.txt
!wc -l prueba/documentos/multilinea.txt
5 prueba/documentos/multilinea.txt
- Mostrar Espacio Disponible
- Objetivo: Visualizar el espacio disponible en disco en un formato legible.
In [9]:
Copied!
!df -h
!df -h
Filesystem Size Used Avail Use% Mounted on overlay 108G 37G 71G 35% / tmpfs 64M 0 64M 0% /dev shm 5.8G 0 5.8G 0% /dev/shm /dev/root 2.0G 1.2G 820M 59% /usr/sbin/docker-init tmpfs 6.4G 4.4M 6.4G 1% /var/colab /dev/sda1 85G 65G 20G 77% /kaggle/input tmpfs 6.4G 0 6.4G 0% /proc/acpi tmpfs 6.4G 0 6.4G 0% /proc/scsi tmpfs 6.4G 0 6.4G 0% /sys/firmware
- Ver Últimas 3 Líneas de un Archivo
- Objetivo: Mostrar las últimas 3 líneas del archivo
multilinea.txt
.
- Objetivo: Mostrar las últimas 3 líneas del archivo
In [10]:
Copied!
!tail -n 3 prueba/documentos/multilinea.txt
!tail -n 3 prueba/documentos/multilinea.txt
Línea 3 Línea 4 Línea 5
- Buscar una Palabra en los Archivos de Logs
- Objetivo: Buscar la palabra
error
en todos los archivos.log
.
- Objetivo: Buscar la palabra
In [11]:
Copied!
!grep "error" prueba/logs/*.log
!grep "error" prueba/logs/*.log
prueba/logs/log1.log:Contiene la palabra error. prueba/logs/log2.log:Log sin errores. prueba/logs/log3.log:Más errores en el sistema.
- Redirigir Salida a un Archivo
- Objetivo: Guardar el listado de archivos del directorio
documentos
en un archivo llamadolista.txt
.
- Objetivo: Guardar el listado de archivos del directorio
In [12]:
Copied!
!ls prueba/documentos > prueba/documentos/lista.txt
!ls prueba/documentos > prueba/documentos/lista.txt
- Cambiar Permisos a un Archivo
- Objetivo: Cambiar los permisos del archivo
lectura.txt
para que solo el propietario pueda leer y escribir.
- Objetivo: Cambiar los permisos del archivo
In [14]:
Copied!
!chmod 600 prueba/documentos/lectura.txt
!chmod 600 prueba/documentos/lectura.txt
- Ver Variables de Entorno
- Objetivo: Mostrar todas las variables de entorno actuales.
In [15]:
Copied!
!env
!env
SHELL=/bin/bash NV_LIBCUBLAS_VERSION=12.5.3.2-1 NVIDIA_VISIBLE_DEVICES=all COLAB_JUPYTER_TRANSPORT=ipc NV_NVML_DEV_VERSION=12.5.82-1 NV_CUDNN_PACKAGE_NAME=libcudnn9-cuda-12 CGROUP_MEMORY_EVENTS=/sys/fs/cgroup/memory.events /var/colab/cgroup/jupyter-children/memory.events NV_LIBNCCL_DEV_PACKAGE=libnccl-dev=2.22.3-1+cuda12.5 NV_LIBNCCL_DEV_PACKAGE_VERSION=2.22.3-1 VM_GCE_METADATA_HOST=169.254.169.253 HOSTNAME=d66039cc849a LANGUAGE=en_US TBE_RUNTIME_ADDR=172.28.0.1:8011 COLAB_TPU_1VM= GCE_METADATA_TIMEOUT=3 NVIDIA_REQUIRE_CUDA=cuda>=12.5 brand=unknown,driver>=470,driver<471 brand=grid,driver>=470,driver<471 brand=tesla,driver>=470,driver<471 brand=nvidia,driver>=470,driver<471 brand=quadro,driver>=470,driver<471 brand=quadrortx,driver>=470,driver<471 brand=nvidiartx,driver>=470,driver<471 brand=vapps,driver>=470,driver<471 brand=vpc,driver>=470,driver<471 brand=vcs,driver>=470,driver<471 brand=vws,driver>=470,driver<471 brand=cloudgaming,driver>=470,driver<471 brand=unknown,driver>=535,driver<536 brand=grid,driver>=535,driver<536 brand=tesla,driver>=535,driver<536 brand=nvidia,driver>=535,driver<536 brand=quadro,driver>=535,driver<536 brand=quadrortx,driver>=535,driver<536 brand=nvidiartx,driver>=535,driver<536 brand=vapps,driver>=535,driver<536 brand=vpc,driver>=535,driver<536 brand=vcs,driver>=535,driver<536 brand=vws,driver>=535,driver<536 brand=cloudgaming,driver>=535,driver<536 brand=unknown,driver>=550,driver<551 brand=grid,driver>=550,driver<551 brand=tesla,driver>=550,driver<551 brand=nvidia,driver>=550,driver<551 brand=quadro,driver>=550,driver<551 brand=quadrortx,driver>=550,driver<551 brand=nvidiartx,driver>=550,driver<551 brand=vapps,driver>=550,driver<551 brand=vpc,driver>=550,driver<551 brand=vcs,driver>=550,driver<551 brand=vws,driver>=550,driver<551 brand=cloudgaming,driver>=550,driver<551 NV_LIBCUBLAS_DEV_PACKAGE=libcublas-dev-12-5=12.5.3.2-1 NV_NVTX_VERSION=12.5.82-1 COLAB_JUPYTER_IP=172.28.0.12 NV_CUDA_CUDART_DEV_VERSION=12.5.82-1 NV_LIBCUSPARSE_VERSION=12.5.1.3-1 COLAB_LANGUAGE_SERVER_PROXY_ROOT_URL=http://172.28.0.1:8013/ NV_LIBNPP_VERSION=12.3.0.159-1 NCCL_VERSION=2.22.3-1 KMP_LISTEN_PORT=6000 TF_FORCE_GPU_ALLOW_GROWTH=true ENV=/root/.bashrc PWD=/content COLAB_LANGUAGE_SERVER_PROXY_REQUEST_TIMEOUT=30s TBE_EPHEM_CREDS_ADDR=172.28.0.1:8009 TBE_CREDS_ADDR=172.28.0.1:8008 NV_CUDNN_PACKAGE=libcudnn9-cuda-12=9.2.1.18-1 NVIDIA_DRIVER_CAPABILITIES=compute,utility COLAB_JUPYTER_TOKEN= LAST_FORCED_REBUILD=20250303 NV_NVPROF_DEV_PACKAGE=cuda-nvprof-12-5=12.5.82-1 NV_LIBNPP_PACKAGE=libnpp-12-5=12.3.0.159-1 NV_LIBNCCL_DEV_PACKAGE_NAME=libnccl-dev TCLLIBPATH=/usr/share/tcltk/tcllib1.20 NV_LIBCUBLAS_DEV_VERSION=12.5.3.2-1 COLAB_KERNEL_MANAGER_PROXY_HOST=172.28.0.12 NVIDIA_PRODUCT_NAME=CUDA NV_LIBCUBLAS_DEV_PACKAGE_NAME=libcublas-dev-12-5 USE_AUTH_EPHEM=1 NV_CUDA_CUDART_VERSION=12.5.82-1 UV_PRERELEASE=if-necessary-or-explicit COLAB_WARMUP_DEFAULTS=1 HOME=/root LANG=en_US.UTF-8 COLUMNS=100 CUDA_VERSION=12.5.1 CLOUDSDK_CONFIG=/content/.config NV_LIBCUBLAS_PACKAGE=libcublas-12-5=12.5.3.2-1 NV_CUDA_NSIGHT_COMPUTE_DEV_PACKAGE=cuda-nsight-compute-12-5=12.5.1-1 UV_SYSTEM_PYTHON=true COLAB_RELEASE_TAG=release-colab_20250313-060108_RC00 PYDEVD_USE_FRAME_EVAL=NO KMP_TARGET_PORT=9000 CLICOLOR=1 KMP_EXTRA_ARGS=--logtostderr --listen_host=172.28.0.12 --target_host=172.28.0.12 --tunnel_background_save_url=https://colab.research.google.com/tun/m/cc48301118ce562b961b3c22d803539adc1e0c19/m-s-15190mnce8nm8 --tunnel_background_save_delay=10s --tunnel_periodic_background_save_frequency=30m0s --enable_output_coalescing=true --output_coalescing_required=true --enable_kernel_event_logging=true UV_INSTALL_DIR=/usr/local/bin NV_LIBNPP_DEV_PACKAGE=libnpp-dev-12-5=12.3.0.159-1 COLAB_LANGUAGE_SERVER_PROXY_LSP_DIRS=/datalab/web/pyright/typeshed-fallback/stdlib,/usr/local/lib/python3.10/dist-packages NV_LIBCUBLAS_PACKAGE_NAME=libcublas-12-5 COLAB_KERNEL_MANAGER_PROXY_PORT=6000 CLOUDSDK_PYTHON=python3 NV_LIBNPP_DEV_VERSION=12.3.0.159-1 ENABLE_DIRECTORYPREFETCHER=1 NO_GCE_CHECK=False JPY_PARENT_PID=87 PYTHONPATH=/env/python TERM=xterm-color NV_LIBCUSPARSE_DEV_VERSION=12.5.1.3-1 GIT_PAGER=cat LIBRARY_PATH=/usr/local/cuda/lib64/stubs NV_CUDNN_VERSION=9.2.1.18-1 SHLVL=0 PAGER=cat COLAB_LANGUAGE_SERVER_PROXY=/usr/colab/bin/language_service NV_CUDA_LIB_VERSION=12.5.1-1 NVARCH=x86_64 NV_CUDNN_PACKAGE_DEV=libcudnn9-dev-cuda-12=9.2.1.18-1 MPLBACKEND=module://matplotlib_inline.backend_inline NV_LIBNCCL_PACKAGE=libnccl2=2.22.3-1+cuda12.5 LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64 COLAB_GPU= GCS_READ_CACHE_BLOCK_SIZE_MB=16 NV_CUDA_NSIGHT_COMPUTE_VERSION=12.5.1-1 NV_NVPROF_VERSION=12.5.82-1 LC_ALL=en_US.UTF-8 _PYVIZ_COMMS_INSTALLED=1 COLAB_FILE_HANDLER_ADDR=localhost:3453 PATH=/opt/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/tools/node/bin:/tools/google-cloud-sdk/bin NV_LIBNCCL_PACKAGE_NAME=libnccl2 COLAB_DEBUG_ADAPTER_MUX_PATH=/usr/local/bin/dap_multiplexer NV_LIBNCCL_PACKAGE_VERSION=2.22.3-1 PYTHONWARNINGS=ignore:::pip._internal.cli.base_command DEBIAN_FRONTEND=noninteractive COLAB_BACKEND_VERSION=next OLDPWD=/ _=/usr/bin/env
- Eliminar Archivos de Logs Antiguos
- Objetivo: Eliminar los archivos
.log
que tengan más de 7 días de antigüedad.
- Objetivo: Eliminar los archivos
In [17]:
Copied!
!find prueba/logs -name "*.log" -mtime +7 -exec rm {} \;
!find prueba/logs -name "*.log" -mtime +7 -exec rm {} \;
Programación en Bash¶
- Script de Saludo
- Objetivo: Crear un script que pida el nombre del usuario y lo salude.
In [18]:
Copied!
%%writefile saludo.sh
#!/bin/bash
read -p "¿Cuál es tu nombre? " nombre
echo "¡Hola, $nombre!"
%%writefile saludo.sh
#!/bin/bash
read -p "¿Cuál es tu nombre? " nombre
echo "¡Hola, $nombre!"
Writing saludo.sh
In [19]:
Copied!
!chmod +x saludo.sh
!./saludo.sh
!chmod +x saludo.sh
!./saludo.sh
¿Cuál es tu nombre? francisco ¡Hola, francisco!
- Contar Archivos en un Directorio
- Objetivo: Contar cuántos archivos hay en el directorio
documentos
.
- Objetivo: Contar cuántos archivos hay en el directorio
In [20]:
Copied!
%%writefile contar_archivos.sh
#!/bin/bash
total=$(ls prueba/documentos | wc -l)
echo "Hay $total archivos en el directorio documentos."
%%writefile contar_archivos.sh
#!/bin/bash
total=$(ls prueba/documentos | wc -l)
echo "Hay $total archivos en el directorio documentos."
Writing contar_archivos.sh
In [21]:
Copied!
!chmod +x contar_archivos.sh
!./contar_archivos.sh
!chmod +x contar_archivos.sh
!./contar_archivos.sh
Hay 9 archivos en el directorio documentos.
- Verificar si un Archivo Existe
- Objetivo: Verificar si el archivo
archivo1.txt
existe.
- Objetivo: Verificar si el archivo
In [22]:
Copied!
%%writefile verificar_archivo.sh
#!/bin/bash
if [ -f "prueba/documentos/archivo1.txt" ]; then
echo "El archivo existe."
else
echo "El archivo no existe."
fi
%%writefile verificar_archivo.sh
#!/bin/bash
if [ -f "prueba/documentos/archivo1.txt" ]; then
echo "El archivo existe."
else
echo "El archivo no existe."
fi
Writing verificar_archivo.sh
In [23]:
Copied!
!chmod +x verificar_archivo.sh
!./verificar_archivo.sh
!chmod +x verificar_archivo.sh
!./verificar_archivo.sh
El archivo existe.
- Sumar Dos Números
- Objetivo: Solicitar dos números y mostrar su suma.
In [24]:
Copied!
%%writefile suma.sh
#!/bin/bash
read -p "Ingresa el primer número: " num1
read -p "Ingresa el segundo número: " num2
echo "La suma es: $((num1 + num2))"
%%writefile suma.sh
#!/bin/bash
read -p "Ingresa el primer número: " num1
read -p "Ingresa el segundo número: " num2
echo "La suma es: $((num1 + num2))"
Writing suma.sh
In [25]:
Copied!
!chmod +x suma.sh
!./suma.sh
!chmod +x suma.sh
!./suma.sh
Ingresa el primer número: 4 Ingresa el segundo número: 5 La suma es: 9
- Listar Archivos Usando un Bucle For
- Objetivo: Listar cada archivo en el directorio
documentos
utilizando un bucle.
- Objetivo: Listar cada archivo en el directorio
In [26]:
Copied!
%%writefile listar_archivos.sh
#!/bin/bash
for archivo in prueba/documentos/*; do
echo "Archivo: $archivo"
done
%%writefile listar_archivos.sh
#!/bin/bash
for archivo in prueba/documentos/*; do
echo "Archivo: $archivo"
done
Writing listar_archivos.sh
In [27]:
Copied!
!chmod +x listar_archivos.sh
!./listar_archivos.sh
!chmod +x listar_archivos.sh
!./listar_archivos.sh
Archivo: prueba/documentos/archivo1.txt Archivo: prueba/documentos/archivo2.txt Archivo: prueba/documentos/datos.csv Archivo: prueba/documentos/imagen.jpg Archivo: prueba/documentos/lectura.txt Archivo: prueba/documentos/lista.txt Archivo: prueba/documentos/multilinea.txt Archivo: prueba/documentos/script.sh Archivo: prueba/documentos/vacio.txt
- Mostrar un Menú de Opciones
- Objetivo: Crear un menú en Bash que permita seleccionar una opción.
In [28]:
Copied!
%%writefile menu.sh
#!/bin/bash
echo "Selecciona una opción:"
echo "1. Mostrar archivos"
echo "2. Salir"
read -p "Opción: " opcion
case $opcion in
1) ls prueba/documentos;;
2) echo "Saliendo...";;
*) echo "Opción no válida";;
esac
%%writefile menu.sh
#!/bin/bash
echo "Selecciona una opción:"
echo "1. Mostrar archivos"
echo "2. Salir"
read -p "Opción: " opcion
case $opcion in
1) ls prueba/documentos;;
2) echo "Saliendo...";;
*) echo "Opción no válida";;
esac
Writing menu.sh
In [29]:
Copied!
!chmod +x menu.sh
!./menu.sh
!chmod +x menu.sh
!./menu.sh
Selecciona una opción: 1. Mostrar archivos 2. Salir Opción: 1 archivo1.txt datos.csv lectura.txt multilinea.txt vacio.txt archivo2.txt imagen.jpg lista.txt script.sh
- Contar Archivos
.txt
- Objetivo: Contar cuántos archivos
.txt
hay endocumentos
.
- Objetivo: Contar cuántos archivos
In [30]:
Copied!
%%writefile contar_txt.sh
#!/bin/bash
total=$(ls prueba/documentos/*.txt 2>/dev/null | wc -l)
echo "Hay $total archivos .txt."
%%writefile contar_txt.sh
#!/bin/bash
total=$(ls prueba/documentos/*.txt 2>/dev/null | wc -l)
echo "Hay $total archivos .txt."
Writing contar_txt.sh
In [31]:
Copied!
!chmod +x contar_txt.sh
!./contar_txt.sh
!chmod +x contar_txt.sh
!./contar_txt.sh
Hay 6 archivos .txt.
- Crear Archivos en un Bucle
- Objetivo: Crear cinco archivos de prueba dentro del directorio
backup
.
- Objetivo: Crear cinco archivos de prueba dentro del directorio
In [32]:
Copied!
%%writefile crear_archivos.sh
#!/bin/bash
for i in {1..5}; do
touch prueba/backup/backup$i.txt
done
echo "Archivos backup creados."
%%writefile crear_archivos.sh
#!/bin/bash
for i in {1..5}; do
touch prueba/backup/backup$i.txt
done
echo "Archivos backup creados."
Writing crear_archivos.sh
In [33]:
Copied!
!chmod +x crear_archivos.sh
!./crear_archivos.sh
!chmod +x crear_archivos.sh
!./crear_archivos.sh
Archivos backup creados.
- Verificar si un Número es Par o Impar
- Objetivo: Solicitar un número y verificar si es par o impar.
In [34]:
Copied!
%%writefile par_impar.sh
#!/bin/bash
read -p "Introduce un número: " num
if [ $((num % 2)) -eq 0 ]; then
echo "El número es par."
else
echo "El número es impar."
fi
%%writefile par_impar.sh
#!/bin/bash
read -p "Introduce un número: " num
if [ $((num % 2)) -eq 0 ]; then
echo "El número es par."
else
echo "El número es impar."
fi
Writing par_impar.sh
In [35]:
Copied!
!chmod +x par_impar.sh
!./par_impar.sh
!chmod +x par_impar.sh
!./par_impar.sh
Introduce un número: 4 El número es par.
- Realizar un Backup de Directorio
- Objetivo: Copiar el contenido del directorio
documentos
a
- Objetivo: Copiar el contenido del directorio
In [36]:
Copied!
%%writefile backup.sh
#!/bin/bash
cp -r prueba/documentos/* prueba/backup/
echo "Backup realizado correctamente."
%%writefile backup.sh
#!/bin/bash
cp -r prueba/documentos/* prueba/backup/
echo "Backup realizado correctamente."
Writing backup.sh
In [37]:
Copied!
!chmod +x backup.sh
!./backup.sh
!chmod +x backup.sh
!./backup.sh
Backup realizado correctamente.