Datei- und Verzeichnisoperationen

LinuxBeginner
Jetzt üben

Einführung

Linux organisiert Dateien in einem einzigen Verzeichnisbaum, der bei /, dem Wurzelverzeichnis, beginnt. Jede Datei und jedes Verzeichnis hat einen Pfad, der seine Position in diesem Baum beschreibt. Wenn Sie lernen, Pfade zu lesen und zu verwenden, werden fast alle späteren Aufgaben unter Linux einfacher.

In diesem Lab erstellen Sie einen kleinen Arbeitsbereich und lernen dabei die Operationen kennen, die bei der täglichen Arbeit im Terminal verwendet werden. Sie navigieren durch Verzeichnisse, erstellen und bearbeiten Dateien, kopieren und verschieben Daten, suchen Dateien, untersuchen Metadaten und Inodes, arbeiten mit Hardlinks und symbolischen Links und vergleichen Dateien sowie Verzeichnisbäume mit diff.

Den Linux-Verzeichnisbaum erkunden

In diesem Schritt ermitteln Sie Ihren aktuellen Speicherort, untersuchen wichtige Verzeichnisse auf der obersten Ebene und erstellen einen eigenen Arbeitsbereich für den restlichen Teil des Labs.

Der Befehl pwd steht für „print working directory“. Führen Sie ihn zuerst aus, damit Sie wissen, in welchem Verzeichnis das Terminal gestartet wurde:

pwd

Das Ergebnis sollte /home/labex/project lauten. Ein absoluter Pfad beginnt mit / und beschreibt einen Speicherort ausgehend vom Wurzelverzeichnis des Dateisystems.

Listen Sie die oberste Ebene des Dateisystems auf:

ls /

Sie sehen Standardverzeichnisse wie etc, home, tmp, usr und var. Ihre üblichen Aufgaben sind:

  • /etc enthält systemweite Konfigurationsdateien.
  • /home enthält die Home-Verzeichnisse normaler Benutzer.
  • /tmp enthält temporäre Daten.
  • /usr enthält viele installierte Programme und gemeinsam genutzte Ressourcen.
  • /var enthält veränderliche Daten wie Protokolle und Caches.

Die Option -d weist ls an, die angegebenen Verzeichnisse selbst zu beschreiben, anstatt deren Inhalte aufzulisten. Die Option -l aktiviert das Langformat:

ls -ld /etc /home /tmp /usr /var

Das erste Zeichen jeder Zeile ist d. Es zeigt an, dass es sich bei dem Objekt um ein Verzeichnis handelt. Die übrigen Spalten enthalten Berechtigungen, Eigentümer, Größe, Zeitangabe und Namen.

Erstellen Sie einen Arbeitsbereich für dieses Lab. Mit der Option -p kann mkdir fehlende übergeordnete Verzeichnisse anlegen. Außerdem wird kein Fehler ausgegeben, wenn das Verzeichnis bereits existiert:

mkdir -p /home/labex/project/file-ops-lab

Wechseln Sie in dieses Verzeichnis und überprüfen Sie den neuen Speicherort:

cd /home/labex/project/file-ops-lab
pwd

Die letzte Ausgabe sollte /home/labex/project/file-ops-lab lauten.

Mit absoluten und relativen Pfaden navigieren

In diesem Schritt erstellen Sie einen verschachtelten Verzeichnisbaum und navigieren mithilfe absoluter Pfade, relativer Pfade und spezieller Navigationskürzel durch ihn.

Stellen Sie sicher, dass Sie im Arbeitsbereich des Labs beginnen:

cd /home/labex/project/file-ops-lab

Erstellen Sie drei verschachtelte Verzeichnisse mit einem einzigen Befehl:

mkdir -p navigation/alpha/beta

navigation/alpha/beta ist hier ein relativer Pfad, weil er nicht mit / beginnt. Die Shell löst ihn relativ zu Ihrem aktuellen Verzeichnis auf.

Verwenden Sie einen absoluten Pfad, um in das tiefste Verzeichnis zu wechseln:

cd /home/labex/project/file-ops-lab/navigation/alpha/beta
pwd

Der spezielle Pfad .. bezeichnet das übergeordnete Verzeichnis. Wechseln Sie von beta nach alpha:

cd ..
pwd

Die Ausgabe sollte mit /navigation/alpha enden. Der Befehl cd - bringt Sie zurück in das vorherige Arbeitsverzeichnis:

cd -
pwd

Sie sollten wieder in beta sein. Schließlich steht ~ für Ihr Home-Verzeichnis. Verwenden Sie es am Anfang eines Pfads, um in den Arbeitsbereich des Labs zurückzukehren:

cd ~/project/file-ops-lab
pwd

Absolute Pfade funktionieren unabhängig von Ihrem aktuellen Speicherort. Relative Pfade sind kürzer, wenn Sie bereits wissen, in welchem Verzeichnis Sie sich befinden.

Verzeichnisse erstellen und Dateien schreiben

In diesem Schritt erstellen Sie Verzeichnisse und Dateien. Anschließend lernen Sie den Unterschied zwischen dem Überschreiben und dem Anhängen mithilfe von Shell-Umleitungen kennen.

Beginnen Sie im Arbeitsbereich des Labs und erstellen Sie zwei Verzeichnisse gleichzeitig:

cd /home/labex/project/file-ops-lab
mkdir documents archive

Der Befehl touch erstellt eine leere Datei, wenn die angegebene Datei noch nicht existiert:

touch documents/empty.txt

Untersuchen Sie die leere Datei im Langformat:

ls -l documents/empty.txt

Ihre Größe sollte 0 Bytes betragen. Als Nächstes leitet > die Befehlsausgabe in eine Datei um. Der Operator erstellt die Datei oder ersetzt ihren bisherigen Inhalt:

echo "Linux file practice" > documents/notes.txt

Der Operator >> hängt die Ausgabe an, ohne den vorhandenen Inhalt zu entfernen:

echo "Paths identify each filesystem object" >> documents/notes.txt

Geben Sie die vollständige Datei mit cat aus:

cat documents/notes.txt

Sie sollten zwei Zeilen in ihrer ursprünglichen Reihenfolge sehen. Zählen Sie die Zeilen mit wc -l. Die Option -l weist wc an, Zeilen zu zählen:

wc -l documents/notes.txt

Das erste Feld sollte 2 lauten.

Dateien kopieren, verschieben, umbenennen und entfernen

In diesem Schritt üben Sie die vier häufigsten Änderungen an Objekten im Dateisystem: Kopieren, Verschieben, Umbenennen und Entfernen.

Kehren Sie in den Arbeitsbereich des Labs zurück:

cd /home/labex/project/file-ops-lab

Der Befehl cp kopiert eine Quelle in ein Ziel. Kopieren Sie notes.txt unter einem neuen Namen in das Archiv:

cp documents/notes.txt archive/notes-backup.txt

Überprüfen Sie, dass sowohl die Quelle als auch die Kopie vorhanden sind:

ls -l documents/notes.txt archive/notes-backup.txt

Erstellen Sie eine temporäre Datei und verwenden Sie anschließend mv, um sie in einem Schritt zu verschieben und umzubenennen:

echo "draft" > documents/draft.txt
mv documents/draft.txt archive/final-draft.txt

Der alte Pfad sollte nicht mehr existieren, während der neue Pfad vorhanden sein sollte:

ls -l archive/final-draft.txt

Um ein Verzeichnis einschließlich aller Inhalte zu kopieren, verwenden Sie die rekursive Option -r:

cp -r documents archive/documents-copy
find archive/documents-copy -maxdepth 1 -type f

Der Befehl rm entfernt Dateien dauerhaft. Im Terminal gibt es keinen Papierkorb. Erstellen und entfernen Sie eine entbehrliche Datei:

touch disposable.tmp
rm disposable.tmp

Listen Sie das aktuelle Verzeichnis auf, um zu überprüfen, dass der Pfad verschwunden ist:

ls

disposable.tmp sollte nicht erscheinen. Prüfen Sie einen Pfad immer sorgfältig, bevor Sie rm verwenden.

Dateien anzeigen, aktualisieren und suchen

In diesem Schritt erstellen Sie eine Datei mit mehreren Zeilen, untersuchen verschiedene Teile davon, aktualisieren sie durch Anhängen und suchen sie anschließend anhand ihres Namens.

Kehren Sie in den Arbeitsbereich des Labs zurück. Ein Here-Dokument übergibt mehrere Zeilen an einen Befehl, bis die Shell eine Zeile erreicht, die nur die ausgewählte Markierung enthält, hier EOF:

cd /home/labex/project/file-ops-lab
cat > documents/journal.txt <<'EOF'
First entry: created a workspace
Second entry: practiced paths
Third entry: copied files
EOF

Die Anführungszeichen um 'EOF' verhindern, dass die Shell Sonderzeichen innerhalb des Dokuments expandiert. Geben Sie die Datei mit Zeilennummern aus:

nl -ba documents/journal.txt

Die Option -ba nummeriert alle Zeilen. Verwenden Sie head -n 2 für die ersten beiden Zeilen und tail -n 1 für die letzte Zeile:

head -n 2 documents/journal.txt
tail -n 1 documents/journal.txt

Hängen Sie einen vierten Eintrag an. Sie haben zuvor bereits >> verwendet. Der Operator fügt die Ausgabe am Ende hinzu, ohne die vorhandenen drei Zeilen zu ersetzen:

echo "Fourth entry: reviewed the results" >> documents/journal.txt

Überprüfen Sie das Ergebnis:

tail -n 2 documents/journal.txt

Suchen Sie nun im Arbeitsbereich nach Textdateien. In find steht . für das aktuelle Verzeichnis. -type f beschränkt die Ergebnisse auf reguläre Dateien, und -name gleicht ein Dateinamensmuster ab. Die Anführungszeichen verhindern, dass die Shell *.txt expandiert, bevor find das Muster erhält:

find . -type f -name "*.txt"

Die Ausgabe sollte neben den anderen von Ihnen erstellten Textdateien auch ./documents/journal.txt enthalten.

Dateitypen, Metadaten und Inodes untersuchen

In diesem Schritt gehen Sie über den Dateinamen hinaus und untersuchen die Informationen, die Linux zu einem Objekt im Dateisystem speichert.

Beginnen Sie im Arbeitsbereich des Labs und lassen Sie file zwei unterschiedliche Objekte identifizieren:

cd /home/labex/project/file-ops-lab
file documents/journal.txt /bin/ls

Das Journal wird als Text identifiziert, während /bin/ls als ausführbares Programm erkannt wird. Linux verwendet zur Identifizierung von Daten nicht nur Dateinamenerweiterungen.

Der Befehl stat zeigt Metadaten wie Größe, Berechtigungen, Eigentümer, Zeitstempel und Inode-Nummer an:

stat documents/journal.txt

Ein Inode ist der Datensatz des Dateisystems, der die Metadaten einer Datei speichert und auf deren Daten verweist. Ein Dateiname ist ein Verzeichniseintrag, der auf einen Inode verweist. Verwenden Sie ein benutzerdefiniertes stat-Format, um stabile Felder anzuzeigen:

stat -c 'name=%n type=%F size=%s inode=%i links=%h' documents/journal.txt

Das Feld %i enthält die Inode-Nummer, während %h die Anzahl der Hardlinks angibt, die auf diesen Inode verweisen.

Auch die Option -i von ls zeigt Inode-Nummern an. Erstellen Sie eine Datei zum Üben von Metadaten und untersuchen Sie sie:

echo "inode practice" > metadata-sample.txt
ls -li metadata-sample.txt

Die Zahl am Anfang der Zeile ist die Inode-Nummer. Sie kann sich zwischen Umgebungen unterscheiden. Konzentrieren Sie sich daher darauf, wofür dieses Feld steht, statt sich den Wert zu merken.

In diesem Schritt erstellen Sie beide Arten von Linux-Links und beobachten, wie sie sich verhalten, wenn der ursprüngliche Dateiname entfernt wird.

Erstellen Sie ein Verzeichnis und eine Quelldatei für das Experiment:

cd /home/labex/project/file-ops-lab
mkdir links
echo "shared inode data" > links/source.txt

Der Befehl ln erstellt ohne Option einen Hardlink. Beide Namen verweisen auf denselben Inode und dieselben Dateidaten:

ln links/source.txt links/hard-link.txt

Die Option -s erstellt einen symbolischen Link, auch Symlink genannt. Ein symbolischer Link speichert einen Pfad zu einer anderen Datei:

ln -s source.txt links/symbolic-link.txt

Vergleichen Sie die Inode-Nummern und die Link-Informationen:

ls -li links

source.txt und hard-link.txt sollten dieselbe Inode-Nummer haben. Der symbolische Link besitzt einen eigenen Inode und zeigt -> source.txt an.

Verwenden Sie readlink, um den im symbolischen Link gespeicherten Pfad auszugeben:

readlink links/symbolic-link.txt

Entfernen Sie den ursprünglichen Dateinamen:

rm links/source.txt

Der Hardlink kann weiterhin auf den Inode und dessen Daten zugreifen:

cat links/hard-link.txt

Der symbolische Link verweist jetzt auf einen Namen, der nicht mehr existiert. Versuchen Sie, ihn zu lesen:

cat links/symbolic-link.txt

Der Fehler No such file or directory ist zu erwarten und liefert einen wichtigen Hinweis: Das Link-Objekt ist weiterhin vorhanden, aber der darin gespeicherte Zielpfad ist ungültig. Dieses Experiment zeigt, warum das Löschen eines Namens eines Hardlinks die Daten nicht löscht, solange ein weiterer Hardlink vorhanden ist. Ein symbolischer Link hängt dagegen von seinem gespeicherten Zielpfad ab.

Dateien und Verzeichnisse mit Diff vergleichen

In diesem Schritt verwenden Sie diff, um Unterschiede zu finden, und synchronisieren anschließend zwei kleine Verzeichnisbäume.

Erstellen Sie zwei Versionsverzeichnisse:

cd /home/labex/project/file-ops-lab
mkdir -p comparison/version-a comparison/version-b

Erstellen Sie Konfigurationsdateien, die sich in einer Zeile unterscheiden:

printf 'mode=production\nport=8080\n' > comparison/version-a/app.conf
printf 'mode=production\nport=9090\n' > comparison/version-b/app.conf

Die Option -u fordert von diff eine zusammengefasste Ansicht mit Kontext um jede Änderung an:

diff -u comparison/version-a/app.conf comparison/version-b/app.conf

diff kennzeichnet Zeilen aus der ersten Datei mit - und Zeilen aus der zweiten Datei mit +. Der Status ungleich null bedeutet, dass sich die Dateien unterscheiden. Das ist hier zu erwarten.

Machen Sie die zweite Datei identisch mit der ersten und verwenden Sie anschließend -q für eine Prüfung ohne ausführliche Ausgabe:

cp comparison/version-a/app.conf comparison/version-b/app.conf
diff -q comparison/version-a/app.conf comparison/version-b/app.conf

Keine Ausgabe bedeutet, dass die Dateien übereinstimmen. Fügen Sie nun nur einem Verzeichnis eine Datei hinzu:

echo "release notes" > comparison/version-a/README.txt

Die Option -r vergleicht Verzeichnisbäume rekursiv:

diff -r comparison/version-a comparison/version-b

Die Ausgabe meldet, dass README.txt nur in version-a vorhanden ist. Kopieren Sie die Datei und führen Sie den Vergleich erneut aus:

cp comparison/version-a/README.txt comparison/version-b/README.txt
diff -r comparison/version-a comparison/version-b

Der letzte Befehl sollte keine Ausgabe erzeugen. Damit ist bewiesen, dass beide Verzeichnisbäume jetzt denselben Dateiinhalt enthalten.

Zusammenfassung

Sie haben die grundlegenden Datei- und Verzeichnisoperationen geübt, die bei der Arbeit mit dem Linux-Terminal verwendet werden. Sie haben mit absoluten und relativen Pfaden navigiert, Dateien erstellt und bearbeitet, Daten kopiert und verschoben, eine entbehrliche Datei sicher entfernt und nach Dateinamen gesucht.

Außerdem haben Sie Dateitypen und Metadaten untersucht, gelernt, wie Dateinamen mit Inodes zusammenhängen, Hardlinks mit symbolischen Links verglichen und diff zum Vergleich einzelner Dateien sowie vollständiger Verzeichnisbäume verwendet. Diese Konzepte helfen Ihnen dabei, Linux-Dateien gezielt zu verstehen, statt Befehle nur als voneinander unabhängige Rezepte zu betrachten.