Einführung
In diesem Projekt lernst du, wie du einen benutzerdefinierten ls-Befehl erstellst, der die Größen von Verzeichnissen in einem benutzerfreundlichen Format anzeigt. Dieses Projekt hilft dir zu verstehen, wie du in einer Linux-Umgebung mithilfe von Zsh-Skripting Dateiinformationen abrufen und formatieren kannst.
👀 Vorschau
$ sh newls.sh /home/labex
## Beispiel
drwxr-xr-x 1 labex 6B Okt 13 10:11 Code
drwxr-xr-x 1 labex 120B Okt 13 10:11 Desktop
drwxr-xr-x 1 labex 28B Sep 23 2021 golang
drwxr-xr-x 1 labex 22B Okt 23 10:17 project
🎯 Aufgaben
In diesem Projekt wirst du lernen:
- Wie du ein Zsh-Skript erstellst, um Datei- und Verzeichnisinformationen anzuzeigen
- Wie du die Dateigröße für eine bessere Lesbarkeit formatierst
- Wie du das passende Datumsformat für die Dateiänderungszeiten bestimmst
- Wie du die Dateiinformationen im gleichen Format wie der
ls -lh-Befehl ausgibst
🏆 Errungenschaften
Nach Abschluss dieses Projekts wirst du in der Lage sein:
- Ein Zsh-Skript zu schreiben, das die Größen von Dateien und Verzeichnissen in einem angegebenen Verzeichnis anzeigen kann
- Die Dateigrößeninformationen für eine bessere Lesbarkeit zu formatieren
- Das passende Datumsformat für die Dateiänderungszeiten basierend auf dem aktuellen Jahr und der letzten Änderungszeit der Datei zu bestimmen
- Die Dateiinformationen in einem benutzerfreundlichen Format auszugeben, das mit dem
ls -lh-Befehl übereinstimmt
Erstelle das newls.sh-Skript
In diesem Schritt wirst du das newls.sh-Skript erstellen, das die Größen aller Dateien und Verzeichnisse in einem angegebenen Verzeichnis anzeigt. Folge den Schritten unten, um diesen Schritt abzuschließen:
- Öffne einen Texteditor und erstelle in dem Verzeichnis
/home/labex/projecteine neue Datei namensnewls.sh. - Füge am Anfang der Datei die folgende Shebang-Zeile hinzu, um anzugeben, dass dies ein Zsh-Skript ist:
#!/bin/zsh
- Füge am Anfang des Skripts einen Kommentarblock hinzu, um seinen Zweck zu erklären:
## Dieses Skript ruft Dateiinformationen aus einem angegebenen Verzeichnis ab und formatiert sie, indem es sie im gleichen Format wie der "ls -lh"-Befehl anzeigt.
- Füge nun den Code hinzu, um zu überprüfen, ob der Eingabeparameter (das Verzeichnis, das aufgelistet werden soll) angegeben ist. Wenn nicht, zeige eine Benutzungsmeldung an und beende das Skript:
## Überprüfe, ob der Eingabeparameter leer ist
if [ $## -eq 0 ]; then
echo "Verwendung: sh newls.sh <verzeichnis>"
exit 1
fi
- Füge anschließend den Code hinzu, um zu überprüfen, ob das angegebene Verzeichnis existiert. Wenn nicht, zeige eine Fehlermeldung an und beende das Skript:
## Überprüfe, ob das Verzeichnis existiert
if [! -d "$1" ]; then
echo "Verzeichnis $1 existiert nicht."
exit 1
fi
Abrufen und formatieren von Dateiinformationen
In diesem Schritt wirst du den Code hinzufügen, um die Datei- und Verzeichnisinformationen aus dem angegebenen Verzeichnis abzurufen und die Ausgabe im gleichen Format wie der ls -lh-Befehl zu formatieren. Folge den Schritten unten, um diesen Schritt abzuschließen:
- Verwende den
ls-Befehl, um die detaillierten Informationen über die Dateien und Verzeichnisse im angegebenen Verzeichnis abzurufen, und speichere die Ausgabe in der Variablenls_output:
## Verwende den ls-Befehl, um detaillierte Informationen über Dateien und Verzeichnisse abzurufen, und verarbeite die Ausgabe Zeile für Zeile
ls_output=$(ls -l --time-style="+%b %d %Y %H:%M" "$1" | tail -n +2)
- Füge eine
while-Schleife hinzu, um jede Zeile vonls_outputzu verarbeiten und die erforderlichen Informationen zu extrahieren:
## Verarbeite jede Zeile der ls-Ausgabe
## Entferne das abschließende Leerzeichen von jeder Zeile
## Analysiere jedes Feld der Zeile
- Füge den Code hinzu, um die Dateigröße für eine bessere Lesbarkeit zu formatieren:
## Formatieren Sie die Dateigröße für eine bessere Lesbarkeit
if [[ $size =~ ^[0-9]+$ ]]; then
## Wenn die Größe eine Zahl ist, formatieren Sie sie
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
## Wenn die Größe nicht als Zahl interpretiert werden kann, behalten Sie sie so bei
size_formatted="$size"
fi
- Füge den Code hinzu, um das passende Datumsformat basierend auf der Änderungszeit der Datei zu bestimmen:
current_year=$(date +"%Y")
## Extrahieren Sie das Jahr, den Monat und den Tag aus dem 修改变更日期
file_year=$(echo "$year" | cut -d' ' -f3)
file_month=$(echo "$month" | cut -d' ' -f1)
file_day=$(echo "$day" | cut -d' ' -f1)
## Konvertieren Sie den führenden Nullen im Monat in Dezimalformat
file_month=$(echo "$file_month" | sed 's/^0//')
## Holen Sie sich den Zeitstempel der letzten Änderung der Datei
file_modified=$(date -d "$month $day $year" +"%s")
## Holen Sie sich den Zeitstempel von vor 6 Monaten
six_months_ago=$(date -d "6 months ago" +"%s")
## Berechnen Sie die Differenz in Sekunden zwischen der aktuellen Zeit und der letzten Änderung der Datei
time_diff=$(($(date +"%s") - file_modified))
if ((file_year == current_year)); then
## Wenn das Jahr der Datei dem aktuellen Jahr entspricht
if ((time_diff >= six_months_ago)); then
## Vor mehr als 6 Monaten, zeige das vollständige Datum an: Monat Tag Jahr
formatted_date="$month $day $year"
else
## In den letzten 6 Monaten, zeige das Datum und die Zeit an: Monat Tag HH:MM
formatted_date="$month $day $time"
fi
else
## Wenn das Jahr der Datei von aktuellem Jahr unterschiedlich ist, zeige das vollständige Datum an: Monat Tag Jahr
formatted_date="$month $day $year"
fi
- Schließlich füge den Code hinzu, um die formatierten Dateiinformationen auszugeben:
## Ausgabeformat enthält benutzerdefinierte Datumsformatierung basierend auf der Bedingung
Das vollständige newls.sh-Skript ist jetzt fertig. Du kannst die Datei speichern und zum nächsten Schritt übergehen.
Teste das newls.sh-Skript
In diesem Schritt wirst du das newls.sh-Skript testen, um sicherzustellen, dass es wie erwartet funktioniert. Folge den Schritten unten, um diesen Schritt abzuschließen:
- Öffne ein Terminal und navigiere zum Verzeichnis
/home/labex/project. - Führe das
newls.sh-Skript mit dem Verzeichnis/home/labexals Argument aus:
sh newls.sh /home/labex
- Verifiziere, dass die Ausgabe dem erwarteten Format entspricht, wie in der Challenge-Beschreibung gezeigt:
drwxr-xr-x 1 labex 6B Okt 13 10:11 Code
drwxr-xr-x 1 labex 120B Okt 13 10:11 Desktop
drwxr-xr-x 1 labex 28B Sep 23 2021 golang
drwxr-xr-x 1 labex 22B Okt 23 10:17 project
- Wenn die Ausgabe dem erwarteten Format entspricht, funktioniert dein
newls.sh-Skript korrekt. Wenn nicht, überprüfe das Skript und mache die erforderlichen Korrekturen.
Glückwunsch! Du hast das Projekt erfolgreich abgeschlossen und einen benutzerdefinierten ls-Befehl erstellt, der die Größen von Verzeichnissen in einem benutzerfreundlichen Format anzeigt.
Zusammenfassung
Glückwunsch! Du hast dieses Projekt abgeschlossen. Du kannst in LabEx weitere Labs absolvieren, um deine Fähigkeiten zu verbessern.



