Personnalisation de la liste de fichiers Linux

LinuxLinuxBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce projet, vous allez apprendre à créer une commande personnalisée ls qui affiche les tailles des dossiers dans un format convivial. Ce projet vous aidera à comprendre comment récupérer et formater des informations sur les fichiers dans un environnement Linux à l'aide de scripts Zsh.

👀 Aperçu

$ cd /home/labex
$ sh newls.sh /home/labex
## Exemple
drwxr-xr-x 1 labex 6B Oct 13 10:11 Code
drwxr-xr-x 1 labex 120B Oct 13 10:11 Bureau
drwxr-xr-x 1 labex 28B Sep 23 2021 golang
drwxr-xr-x 1 labex 22B Oct 23 10:17 projet

🎯 Tâches

Dans ce projet, vous allez apprendre :

  • Comment créer un script Zsh pour afficher des informations sur les fichiers et les dossiers
  • Comment formater la taille du fichier pour une meilleure lisibilité
  • Comment déterminer le format de date approprié pour les dates de modification des fichiers
  • Comment afficher les informations sur les fichiers dans le même format que la commande ls -lh

🏆 Réalisations

Après avoir terminé ce projet, vous serez capable de :

  • Écrire un script Zsh qui peut afficher les tailles des fichiers et des dossiers dans un répertoire spécifié
  • Formater les informations sur la taille du fichier pour une meilleure lisibilité
  • Déterminer le format de date approprié pour les dates de modification des fichiers en fonction de l'année en cours et de la dernière date de modification du fichier
  • Afficher les informations sur les fichiers dans un format convivial qui correspond à la commande ls -lh

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL 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(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) 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{{"Personnalisation de la liste de fichiers Linux"}} linux/ls -.-> lab-301467{{"Personnalisation de la liste de fichiers Linux"}} linux/cd -.-> lab-301467{{"Personnalisation de la liste de fichiers Linux"}} linux/awk -.-> lab-301467{{"Personnalisation de la liste de fichiers Linux"}} linux/date -.-> lab-301467{{"Personnalisation de la liste de fichiers Linux"}} end

Créez le script newls.sh

Dans cette étape, vous allez créer le script newls.sh qui affichera les tailles de tous les fichiers et dossiers dans un répertoire spécifié. Suivez les étapes ci-dessous pour terminer cette étape :

  1. Ouvrez un éditeur de texte et créez un nouveau fichier nommé newls.sh dans le répertoire /home/labex/project.
  2. Ajoutez la ligne de shebang suivante au début du fichier pour spécifier que ceci est un script Zsh :
#!/bin/zsh
  1. Ajoutez un bloc de commentaires au début du script pour expliquer son but :
## Ce script récupère et formate les informations sur les fichiers à partir d'un répertoire spécifié, les affichant dans le même format que la commande "ls -lh".
  1. Maintenant, ajoutez le code pour vérifier si le paramètre d'entrée (le répertoire à lister) est fourni. Sinon, affichez un message d'utilisation et quittez le script :
## Vérifiez si le paramètre d'entrée est vide
if [ $## -eq 0 ]; then
  echo "Usage: sh newls.sh <directory>"
  exit 1
fi
  1. Ensuite, ajoutez le code pour vérifier si le répertoire spécifié existe. Sinon, affichez un message d'erreur et quittez le script :
## Vérifiez si le répertoire existe
if [! -d "$1" ]; then
  echo "Le répertoire $1 n'existe pas."
  exit 1
fi

Récupérez et formatez les informations sur les fichiers

Dans cette étape, vous allez ajouter le code pour récupérer les informations sur les fichiers et les dossiers à partir du répertoire spécifié et formater la sortie de la même manière que la commande ls -lh. Suivez les étapes ci-dessous pour terminer cette étape :

  1. Utilisez la commande ls pour récupérer les informations détaillées sur les fichiers et les dossiers dans le répertoire spécifié, et stockez la sortie dans la variable ls_output :
## Utilisez la commande ls pour récupérer des informations détaillées sur les fichiers et les dossiers, puis traitez la sortie ligne par ligne
ls_output=$(ls -l --time-style="+%b %d %Y %H:%M" "$1" | tail -n +2)
  1. Ajoutez une boucle while pour traiter chaque ligne de ls_output et extraire les informations nécessaires :
## Traitez chaque ligne de la sortie de ls
while IFS= read -r line; do
  ## Supprimez les espaces blancs de fin de chaque ligne
  line=$(echo "$line" | sed 's/[[:space:]]*$//')

  ## Analysez chaque champ de la ligne
  permissions=$(echo "$line" | awk '{print $1}')
  link_count=$(echo "$line" | awk '{print $2}')
  owner=$(echo "$line" | awk '{print $3}')
  size=$(echo "$line" | awk '{print $5}')
  month=$(echo "$line" | awk '{print $6}')
  day=$(echo "$line" | awk '{print $7}')
  year=$(echo "$line" | awk '{print $8}')
  time=$(echo "$line" | awk '{print $9}')
  name=$(echo "$line" | awk '{print $10}')
  1. Ajoutez le code pour formater la taille du fichier pour une meilleure lisibilité :
## Formatez la taille du fichier pour une meilleure lisibilité
if [[ $size =~ ^[0-9]+$ ]]; then
  ## Si la taille est un nombre, formatez-la
  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 la taille ne peut pas être analysée comme un nombre, conservez-la telle quelle
  size_formatted="$size"
fi
  1. Ajoutez le code pour déterminer le format de date approprié en fonction de la date de modification du fichier :
current_year=$(date +"%Y")

## Extrait l'année, le mois et le jour de la date de modification
file_year=$(echo "$year" | cut -d' ' -f3)
file_month=$(echo "$month" | cut -d' ' -f1)
file_day=$(echo "$day" | cut -d' ' -f1)

## Convertissez le zéro initial dans le mois au format décimal
file_month=$(echo "$file_month" | sed 's/^0//')

## Obtenez le timestamp de la dernière modification du fichier
file_modified=$(date -d "$month $day $year" +"%s")

## Obtenez le timestamp il y a 6 mois
six_months_ago=$(date -d "6 months ago" +"%s")

## Calculez la différence en secondes entre l'heure actuelle et la dernière modification du fichier
time_diff=$(($(date +"%s") - file_modified))

if ((file_year == current_year)); then
  ## Si l'année du fichier est la même que l'année actuelle
  if ((time_diff >= six_months_ago)); then
    ## Il y a plus de 6 mois, affichez la date complète : Mois Jour Année
    formatted_date="$month $day $year"
  else
    ## Dans les 6 derniers mois, affichez la date et l'heure : Mois Jour HH:MM
    formatted_date="$month $day $time"
  fi
else
  ## Si l'année du fichier est différente de l'année actuelle, affichez la date complète : Mois Jour Année
  formatted_date="$month $day $year"
fi
  1. Enfin, ajoutez le code pour afficher les informations sur les fichiers formatées :
  ## Le format de sortie inclut une mise en forme de date personnalisée selon la condition
  printf "%-12s %-5s %-8s %-8s %s %s %-15s %s\n" "$permissions" "$link_count" "$owner" "$size_formatted" "$formatted_date" "$name"
done <<< "$ls_output"

Le script newls.sh complet est maintenant prêt. Vous pouvez enregistrer le fichier et passer à l'étape suivante.

Testez le script newls.sh

Dans cette étape, vous allez tester le script newls.sh pour vous assurer qu'il fonctionne comme prévu. Suivez les étapes ci-dessous pour terminer cette étape :

  1. Ouvrez un terminal et accédez au répertoire /home/labex/project.
  2. Exécutez le script newls.sh avec le répertoire /home/labex en tant qu'argument :
sh newls.sh /home/labex
  1. Vérifiez que la sortie correspond au format attendu, comme indiqué dans la description du défi :
drwxr-xr-x 1 labex 6B Oct 13 10:11 Code
drwxr-xr-x 1 labex 120B Oct 13 10:11 Bureau
drwxr-xr-x 1 labex 28B Sep 23 2021 golang
drwxr-xr-x 1 labex 22B Oct 23 10:17 projet
  1. Si la sortie correspond au format attendu, votre script newls.sh fonctionne correctement. Sinon, revisez le script et apportez les corrections nécessaires.

Félicitations! Vous avez réussi à terminer le projet et à créer une commande personnalisée ls qui affiche les tailles des dossiers dans un format convivial.

✨ Vérifier la solution et pratiquer

Sommaire

Félicitations! Vous avez terminé ce projet. Vous pouvez pratiquer plus de laboratoires sur LabEx pour améliorer vos compétences.