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
$ 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
Créer 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 :
- Ouvrez un éditeur de texte et créez un nouveau fichier nommé
newls.shdans le répertoire/home/labex/project. - Ajoutez la ligne de shebang suivante au début du fichier pour spécifier que ceci est un script Zsh :
#!/bin/zsh
- 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".
- 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
- 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érer et formater 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 :
- Utilisez la commande
lspour 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 variablels_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)
- Ajoutez une boucle
whilepour traiter chaque ligne dels_outputet extraire les informations nécessaires :
## Traitez chaque ligne de la sortie de ls
## Supprimez les espaces blancs de fin de chaque ligne
## Analysez chaque champ de la ligne
- 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
- 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
- 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
Le script newls.sh complet est maintenant prêt. Vous pouvez enregistrer le fichier et passer à l'étape suivante.
Tester 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 :
- Ouvrez un terminal et accédez au répertoire
/home/labex/project. - Exécutez le script
newls.shavec le répertoire/home/labexen tant qu'argument :
sh newls.sh /home/labex
- 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
- Si la sortie correspond au format attendu, votre script
newls.shfonctionne 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.
Résumé
Félicitations! Vous avez terminé ce projet. Vous pouvez pratiquer plus de laboratoires sur LabEx pour améliorer vos compétences.



