Personalizar la lista de archivos de Linux

LinuxLinuxBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

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

$ cd /home/labex
$ 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

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/TextProcessingGroup -.-> linux/awk("Text Processing") linux/SystemInformationandMonitoringGroup -.-> linux/date("Date/Time Displaying") subgraph Lab Skills linux/echo -.-> lab-301467{{"Personalizar la lista de archivos de Linux"}} linux/ls -.-> lab-301467{{"Personalizar la lista de archivos de Linux"}} linux/cd -.-> lab-301467{{"Personalizar la lista de archivos de Linux"}} linux/awk -.-> lab-301467{{"Personalizar la lista de archivos de Linux"}} linux/date -.-> lab-301467{{"Personalizar la lista de archivos de Linux"}} end

Crea 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

Recupera y formatea la 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.

Prueba 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.