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
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)
- 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}')
- 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
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.