Anpassen der Linux-Dateiausgabe

LinuxBeginner
Jetzt üben

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:

  1. Öffne einen Texteditor und erstelle in dem Verzeichnis /home/labex/project eine neue Datei namens newls.sh.
  2. Füge am Anfang der Datei die folgende Shebang-Zeile hinzu, um anzugeben, dass dies ein Zsh-Skript ist:
#!/bin/zsh
  1. 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.
  1. 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
  1. 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:

  1. Verwende den ls-Befehl, um die detaillierten Informationen über die Dateien und Verzeichnisse im angegebenen Verzeichnis abzurufen, und speichere die Ausgabe in der Variablen ls_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)
  1. Füge eine while-Schleife hinzu, um jede Zeile von ls_output zu 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
  1. 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
  1. 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
  1. 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:

  1. Öffne ein Terminal und navigiere zum Verzeichnis /home/labex/project.
  2. Führe das newls.sh-Skript mit dem Verzeichnis /home/labex als Argument aus:
sh newls.sh /home/labex
  1. 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
  1. 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.

✨ Lösung prüfen und üben✨ Lösung prüfen und üben✨ Lösung prüfen und üben