Personalizar la lista de archivos de Linux

LinuxBeginner
Practicar Ahora

Introducción

En este proyecto, aprenderás a crear un comando ls personalizado que muestre los tamaños de los directorios en un formato amigable para el usuario. Este proyecto te ayudará a entender cómo recuperar y formatear información de archivos en un entorno Linux utilizando scripting de Zsh.

👀 Vista previa

$ sh newls.sh /home/labex
## Ejemplo
drwxr-xr-x 1 labex 6B Oct 13 10:11 Código
drwxr-xr-x 1 labex 120B Oct 13 10:11 Escritorio
drwxr-xr-x 1 labex 28B Sep 23 2021 golang
drwxr-xr-x 1 labex 22B Oct 23 10:17 proyecto

🎯 Tareas

En este proyecto, aprenderás:

  • Cómo crear un script de Zsh para mostrar información de archivos y directorios
  • Cómo formatear el tamaño del archivo para una mejor legibilidad
  • Cómo determinar el formato de fecha adecuado para las fechas de modificación de archivos
  • Cómo emitir la información de archivos en el mismo formato que el comando ls -lh

🏆 Logros

Después de completar este proyecto, podrás:

  • Escribir un script de Zsh que pueda mostrar los tamaños de archivos y directorios en un directorio especificado
  • Formatear la información de tamaño de archivo para una mejor legibilidad
  • Determinar el formato de fecha adecuado para las fechas de modificación de archivos basado en el año actual y la última fecha de modificación del archivo
  • Emitir la información de archivos en un formato amigable para el usuario que coincida con el comando ls -lh

Crear el script newls.sh

En este paso, crearás el script newls.sh que mostrará los tamaños de todos los archivos y directorios en un directorio especificado. Sigue los pasos siguientes para completar este paso:

  1. Abre un editor de texto y crea un nuevo archivo llamado newls.sh en el directorio /home/labex/project.
  2. Agrega la siguiente línea de shebang al principio del archivo para especificar que se trata de un script de Zsh:
#!/bin/zsh
  1. Agrega un bloque de comentarios al principio del script para explicar su propósito:
## Este script recupera y formatea información de archivos de un directorio especificado, mostrándola en el mismo formato que el comando "ls -lh".
  1. Ahora, agrega el código para comprobar si se proporciona el parámetro de entrada (el directorio a listar). Si no es así, muestra un mensaje de uso y sale del script:
## Comprueba si el parámetro de entrada está vacío
if [ $## -eq 0 ]; then
  echo "Uso: sh newls.sh <directorio>"
  exit 1
fi
  1. A continuación, agrega código para comprobar si el directorio especificado existe. Si no es así, muestra un mensaje de error y sale del script:
## Comprueba si el directorio existe
if [! -d "$1" ]; then
  echo "El directorio $1 no existe."
  exit 1
fi
✨ Revisar Solución y Practicar

Recuperar y formatear información de archivos

En este paso, agregará el código para recuperar la información de archivos y directorios del directorio especificado y formatear la salida de la misma manera que el comando ls -lh. Siga los pasos siguientes para completar este paso:

  1. Utilice el comando ls para recuperar la información detallada sobre los archivos y directorios en el directorio especificado, y almacene la salida en la variable ls_output:
## Utiliza el comando ls para recuperar información detallada sobre archivos y directorios, luego procesa la salida línea por línea
ls_output=$(ls -l --time-style="+%b %d %Y %H:%M" "$1" | tail -n +2)
  1. Agregue un bucle while para procesar cada línea de ls_output y extraer la información necesaria:
## Procesa cada línea de la salida de ls
## Elimina los espacios en blanco al final de cada línea

## Analiza cada campo de la línea
  1. Agregue código para formatear el tamaño del archivo para una mejor legibilidad:
## Formatea el tamaño del archivo para una mejor legibilidad
if [[ $size =~ ^[0-9]+$ ]]; then
  ## Si el tamaño es un número, formátelo
  if ((size < 1024)); then
    size_formatted="${size}B"
  elif ((size < 1024 ** 2)); then
    size_formatted="$(printf "%.1f" $(echo "scale=2; $size / 1024" | bc))K"
  elif ((size < 1024 ** 3)); then
    size_formatted="$(printf "%.1f" $(echo "scale=2; $size / (1024**2)" | bc))M"
  else
    size_formatted="$(printf "%.1f" $(echo "scale=2; $size / (1024**3)" | bc))G"
  fi
else
  ## Si el tamaño no se puede analizar como un número, manténgalo tal como está
  size_formatted="$size"
fi
  1. Agregue código para determinar el formato de fecha adecuado basado en la fecha de modificación del archivo:
current_year=$(date +"%Y")

## Extrae el año, mes y día de la fecha de modificación
file_year=$(echo "$year" | cut -d' ' -f3)
file_month=$(echo "$month" | cut -d' ' -f1)
file_day=$(echo "$day" | cut -d' ' -f1)

## Convierte el cero inicial en el mes al formato decimal
file_month=$(echo "$file_month" | sed 's/^0//')

## Obtiene la marca de tiempo de la última modificación del archivo
file_modified=$(date -d "$month $day $year" +"%s")

## Obtiene la marca de tiempo de hace 6 meses
six_months_ago=$(date -d "6 months ago" +"%s")

## Calcula la diferencia en segundos entre la hora actual y la última modificación del archivo
time_diff=$(($(date +"%s") - file_modified))

if ((file_year == current_year)); then
  ## Si el año del archivo es el mismo que el año actual
  if ((time_diff >= six_months_ago)); then
    ## Hace más de 6 meses, muestra la fecha completa: Mes Día Año
    formatted_date="$month $day $year"
  else
    ## Dentro de los últimos 6 meses, muestra la fecha y la hora: Mes Día HH:MM
    formatted_date="$month $day $time"
  fi
else
  ## Si el año del archivo es diferente al año actual, muestra la fecha completa: Mes Día Año
  formatted_date="$month $day $year"
fi
  1. Finalmente, agregue el código para emitir la información de archivos formateada:
## El formato de salida incluye la formateación de fecha personalizada según la condición

El script newls.sh completo ya está listo. Puede guardar el archivo y pasar al siguiente paso.

✨ Revisar Solución y Practicar

Probar el script newls.sh

En este paso, probarás el script newls.sh para asegurarte de que funcione como se espera. Sigue los pasos siguientes para completar este paso:

  1. Abre una terminal y navega hasta el directorio /home/labex/project.
  2. Ejecuta el script newls.sh con el directorio /home/labex como argumento:
sh newls.sh /home/labex
  1. Verifica que la salida coincida con el formato esperado, como se muestra en la descripción del desafío:
drwxr-xr-x 1 labex 6B Oct 13 10:11 Código
drwxr-xr-x 1 labex 120B Oct 13 10:11 Escritorio
drwxr-xr-x 1 labex 28B Sep 23 2021 golang
drwxr-xr-x 1 labex 22B Oct 23 10:17 proyecto
  1. Si la salida coincide con el formato esperado, tu script newls.sh está funcionando correctamente. Si no es así, revisa el script y realiza las correcciones necesarias.

¡Felicitaciones! Has completado con éxito el proyecto y creado un comando ls personalizado que muestra los tamaños de los directorios en un formato amigable para el usuario.

✨ Revisar Solución y Practicar

Resumen

¡Felicitaciones! Has completado este proyecto. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.