VMware ESXi and vSphere Cluster Management
Dateien mit cpio archivieren, entpacken und kopieren
Lerne, wie du mit cpio Dateiarchive erstellst, entpackst und Verzeichnisbäume kopierst. Mit find, gzip, relativen Pfaden und sicheren Dateilisten.
cpio ist ein Kommandozeilenprogramm für Unix- und Linux-Systeme. Es kann Dateien aus einer Dateiliste in ein Archiv schreiben, ein Archiv auslesen und Dateien direkt in ein anderes Verzeichnis kopieren. Die Dateinamen erhält cpio normalerweise über die Standardeingabe, häufig aus find und einer Pipe.
Ein Archiv fasst mehrere Dateien und Verzeichnisse in einem Datenstrom oder einer Datei zusammen. Archivierung und Komprimierung sind dabei zwei verschiedene Aufgaben: cpio erstellt das Archiv, komprimiert dessen Inhalt aber üblicherweise nicht. Für die Komprimierung wird häufig gzip nachgeschaltet.
Die drei Betriebsarten von cpio
Die Betriebsart wird durch eine Hauptoption ausgewählt. Die drei wichtigsten Modi sind Copy-out, Copy-in und Copy-pass.
| Modus | Hauptoption | Eingabe | Ausgabe | Typischer Einsatzzweck |
|---|---|---|---|---|
| Copy-out | -o | Dateinamen über die Standardeingabe | Archiv über die Standardausgabe | Ein Archiv erstellen |
| Copy-in | -i | Archiv über die Standardeingabe | Dateien im Dateisystem | Ein Archiv entpacken oder wiederherstellen |
| Copy-pass | -p | Dateinamen über die Standardeingabe | Dateien in ein Zielverzeichnis | Dateien ohne Zwischenarchiv kopieren |
Standarddatenströme, Pipe und Umleitung
Die Standardeingabe ist der Datenstrom, aus dem ein Programm liest. Die Standardausgabe ist der Datenstrom, in den es schreibt. Eine Pipe mit | verbindet die Ausgabe eines Befehls mit der Eingabe des nächsten Befehls. Mit > wird Ausgabe in eine Datei geschrieben, mit < wird Eingabe aus einer Datei gelesen.
find . -print | cpio -o: Dateinamen gehen über eine Pipe an cpio.cpio -o > archiv.cpio: der Archivdatenstrom wird in eine Datei umgeleitet.cpio -i < archiv.cpio: cpio liest den Archivdatenstrom aus einer Datei.
Copy-out: Archive erstellen
Der Copy-out-Modus wird mit -o aktiviert. cpio erhält eine Liste von Pfadnamen und schreibt daraus ein Archiv auf die Standardausgabe. Die rekursive Auswahl von Dateien übernimmt nicht cpio selbst, sondern typischerweise find.
Das aktuelle Verzeichnis archivieren
find . -print | cpio -ov > archiv.cpio
find . -printsucht ab dem aktuellen Verzeichnis rekursiv und gibt die gefundenen Pfade aus.-oaktiviert Copy-out.-vsteht für „verbose“ und zeigt die verarbeiteten Pfade an.> archiv.cpiospeichert den Archivdatenstrom in der Dateiarchiv.cpio.
Da die Suche bei . beginnt, werden auch Unterverzeichnisse und normalerweise versteckte Dateien unterhalb des aktuellen Verzeichnisses berücksichtigt. Vor dem eigentlichen Archivieren kannst du die Dateiliste prüfen:
find . -print
Ein bestimmtes Verzeichnis archivieren
find /home/bob/example_dir -print | cpio -ov > example_dir.cpio
Hier enthält die Dateiliste absolute Pfade wie /home/bob/example_dir/datei.txt. Die gespeicherte Pfadstruktur beeinflusst später, wo Dateien beim Entpacken angelegt werden. Für besser übertragbare Archive ist es oft sinnvoll, zuerst in das Quellverzeichnis zu wechseln und relative Pfade zu verwenden:
cd /home/bob/example_dir && find . -print | cpio -ov > example_dir.cpio
Dann beginnen die Archivpfade mit . statt mit dem vollständigen absoluten Quellpfad. Das erleichtert die Wiederherstellung in einem bewusst gewählten Zielordner.
Nur bestimmte Dateien aufnehmen
find kann die Dateiliste filtern. Das folgende Beispiel nimmt nur Dateien mit der Endung .log auf:
find . -type f -name '*.log' -print | cpio -ov > logs.cpio
Die Anführungszeichen um das Suchmuster verhindern, dass die Shell das Muster vor der Ausführung von find selbst erweitert.
Copy-in: Archive wiederherstellen
Der Copy-in-Modus wird mit -i aktiviert. cpio liest die Archivdaten aus der Standardeingabe und legt die enthaltenen Dateien im aktuellen Zielverzeichnis an.
In einen Wiederherstellungsordner entpacken
mkdir -p ~/wiederherstellung
cd ~/wiederherstellung
cpio -iv < archiv.cpio
-iaktiviert Copy-in.-vzeigt die entpackten Pfade an.< archiv.cpioliefert die Archivdatei über die Standardeingabe.
Der Extraktionsort ist das Verzeichnis, in dem der Befehl ausgeführt wird. Deshalb solltest du vor dem Entpacken entweder in den gewünschten Zielordner wechseln oder diesen bewusst anlegen. Die im Archiv gespeicherten Pfade werden unterhalb dieses Ortes ausgewertet. Ein Archiv mit relativen Pfaden wie ./docs/bericht.txt erzeugt beispielsweise einen Pfad unterhalb des aktuellen Verzeichnisses. Absolute oder unerwartet strukturierte Pfade können dagegen zu überraschenden Zielorten führen.
Bei Archiven mit verschachtelten Verzeichnissen ist je nach cpio-Implementierung die Option -d nützlich, damit benötigte Zielverzeichnisse automatisch angelegt werden:
mkdir -p ~/wiederherstellung
cd ~/wiederherstellung
cpio -idv < archiv.cpio
Vor einer Wiederherstellung in ein wichtiges Verzeichnis solltest du den Inhalt und die Pfade des Archivs kontrollieren und möglichst in einem Testordner arbeiten.
Copy-pass: Verzeichnisinhalte direkt kopieren
Der Copy-pass-Modus wird mit -p aktiviert. Er liest eine Dateiliste und schreibt die Dateien direkt in ein angegebenes Zielverzeichnis. Es entsteht keine Archivdatei.
cd /home/bob/example_dir && find . -print | cpio -pvd /home/bob/new_directory
-paktiviert Copy-pass.-vzeigt die verarbeiteten Dateien an.-dlegt notwendige Zielverzeichnisse an./home/bob/new_directoryist das Zielargument.
Die Originaldateien bleiben erhalten. Durch den Wechsel in das Quellverzeichnis liefert find relative Namen. Dadurch wird nicht automatisch der gesamte absolute Pfad /home/bob/example_dir unter dem Ziel nachgebildet.
Gegenüber einem einfachen rekursiven cp kann cpio bei geeigneten Optionen und ausreichenden Rechten Dateiattribute wie Zugriffsrechte und Zeitstempel genauer übernehmen. Für eine vollständige Übernahme von Eigentümern sind jedoch normalerweise administrative Rechte erforderlich. Das Ziel-Dateisystem kann außerdem bestimmte Attribute nicht unterstützen.
Dateiattribute und Metadaten
Metadaten sind Eigenschaften einer Datei, nicht ihr eigentlicher Inhalt. Dazu gehören insbesondere:
- Eigentümer und Gruppe
- Zugriffsrechte, zum Beispiel Lesen, Schreiben und Ausführen
- Zeitstempel, etwa die Änderungszeit
Bei einer Wiederherstellung können diese Informationen entscheidend sein. Falsche Berechtigungen können Programme unbrauchbar machen oder vertrauliche Dateien zu weit öffnen. Falsche Eigentümer können bei Systemdateien, Webanwendungen oder Benutzerverzeichnissen zu Zugriffsproblemen führen. Zeitstempel sind beispielsweise für Build-Systeme, Synchronisation und Änderungsprüfungen relevant.
Die Erhaltung ist nicht grenzenlos garantiert: Ein nicht privilegierter Benutzer darf fremde Eigentümer meist nicht setzen, und manche Dateisysteme unterstützen bestimmte Unix-Eigenschaften nicht. Prüfe nach einer wichtigen Wiederherstellung daher Eigentümer, Rechte und Zeitstempel mit Werkzeugen wie ls -l und stat.
Sicherer Umgang mit Pfaden und Dateilisten
Relative und absolute Pfade
Ein absoluter Pfad beginnt mit / und beschreibt einen Ort unabhängig vom aktuellen Verzeichnis, etwa /home/bob/example_dir. Ein relativer Pfad wird vom aktuellen Verzeichnis aus aufgelöst, etwa ./docs/bericht.txt.
Für Archive sind relative Pfade oft portabler. Wechsle dazu in das Quellverzeichnis und starte find mit .. Beim Entpacken kannst du anschließend den Zielordner selbst festlegen.
Warum find besser als ls geeignet ist
ls ist für die Anzeige auf dem Bildschirm gedacht, nicht für zuverlässige maschinenlesbare Dateilisten. Leerzeichen, Zeilenumbrüche, Steuerzeichen und besondere Dateinamen können die Ausgabe mehrdeutig machen. find ist für Such- und Verarbeitungsaufgaben besser geeignet und kann die Liste rekursiv sowie anhand von Typ, Namen oder anderen Kriterien erzeugen.
Dateinamen mit Sonderzeichen
Eine zeilengetrennte Liste kann bei Dateinamen mit Zeilenumbrüchen problematisch sein. Für solche Fälle erzeugt find -print0 eine NUL-getrennte Liste. Eine passende cpio-Option ist in vielen Implementierungen -0:
find . -print0 | cpio -0ov > archiv.cpio
NUL ist ein Zeichen, das in Unix-Dateinamen nicht vorkommen darf, und eignet sich deshalb als eindeutiger Trenner. Prüfe mit man cpio, ob deine konkrete cpio-Implementierung -0 unterstützt und welche genaue Bezeichnung dafür gilt.
Komprimierte cpio-Archive
gzip komprimiert einen Datenstrom, während cpio die Archivstruktur erzeugt oder liest. Beide Schritte lassen sich mit Pipes verbinden. Die Endung .gz beschreibt die gzip-Komprimierung; sie sagt nicht allein aus, welches Archivformat sich darin befindet. .cpio.gz macht kenntlich, dass ein cpio-Datenstrom mit gzip komprimiert wurde.
Erstellen
find . -print | cpio -ov | gzip > archiv.cpio.gz
Die Daten fließen von find zu cpio und anschließend zu gzip. Erst gzip schreibt den komprimierten Datenstrom in die Datei.
Wiederherstellen
mkdir -p ~/wiederherstellung
cd ~/wiederherstellung
gunzip -c archiv.cpio.gz | cpio -idv
gunzip -c dekomprimiert nach stdout, ohne eine entpackte Zwischen-Datei anzulegen. cpio liest diesen Datenstrom im Copy-in-Modus.
Wichtige Befehlsbausteine und Optionen
| Baustein | Bedeutung | Verwendung im Beispiel |
|---|---|---|
find | Rekursives Suchen und Ausgeben von Pfadnamen | find . -print |
cpio -o | Copy-out: Archiv schreiben | cpio -ov > archiv.cpio |
cpio -i | Copy-in: Archiv lesen und extrahieren | cpio -iv < archiv.cpio |
cpio -p | Copy-pass: direkt in ein Ziel kopieren | cpio -pvd ziel |
-v | Verarbeitete Pfade anzeigen | Bei Erstellung, Extraktion und Kopieren |
> | Standardausgabe in eine Datei umleiten | > archiv.cpio |
< | Standardeingabe aus einer Datei lesen | < archiv.cpio |
| | Ausgabe an den nächsten Befehl weiterleiten | find . -print | cpio -o |
gzip | Datenstrom komprimieren | cpio -o | gzip |
gunzip | gzip-Datenstrom dekomprimieren | gunzip -c archiv.cpio.gz |
Fehlerbehebung
Das Archiv enthält nicht die erwarteten Dateien
Prüfe zuerst die Ausgabe von find ohne Pipe:
find . -print
Häufig wurde die Suche aus dem falschen Arbeitsverzeichnis gestartet oder durch einen Filter zu stark eingeschränkt. Für eine vollständige rekursive Auswahl ab dem aktuellen Verzeichnis ist find . ein geeigneter Ausgangspunkt.
Dateien werden an einem unerwarteten Pfad angelegt
Untersuche, ob das Archiv absolute Pfade oder eine unerwartete Verzeichnisstruktur enthält. Erstelle Archive bevorzugt nach einem Wechsel in das Quellverzeichnis mit relativen Namen. Wechsle beim Entpacken in einen eigens angelegten Zielordner und prüfe die Pfadstruktur dort zuerst.
Sonderzeichen werden fehlerhaft verarbeitet
Verwende nicht ls als Quelle für komplizierte Dateinamen. Nutze stattdessen find -print0 zusammen mit einer passenden NUL-Verarbeitung wie cpio -0. Prüfe die verfügbaren Optionen deiner Implementierung mit man cpio.
Eigentümer, Rechte oder Zeitstempel fehlen
Der ausführende Benutzer hat möglicherweise nicht die nötigen Rechte, oder das Ziel-Dateisystem unterstützt die Attribute nicht. Prüfe Berechtigungen und Dateisystem. Für systemweite Wiederherstellungen können geeignete administrative Rechte erforderlich sein.
Das Archiv ist größer als erwartet
cpio archiviert, komprimiert aber nicht automatisch. Verwende eine Pipeline mit gzip, wenn ein komprimiertes Archiv benötigt wird.
Copy-pass kann das Ziel nicht beschreiben
Lege das Ziel an oder verwende -d zum automatischen Erzeugen fehlender Verzeichnisse. Prüfe außerdem Schreibrechte und freien Speicherplatz:
mkdir -p /home/bob/new_directory
cd /home/bob/example_dir && find . -print | cpio -pvd /home/bob/new_directory
Prüfung und Merksätze
- Copy-out:
-oschreibt eine Dateiliste in ein Archiv. - Copy-in:
-iliest ein Archiv aus stdin und extrahiert es am aktuellen Ort. - Copy-pass:
-pkopiert eine Dateiliste direkt in ein Zielverzeichnis. - Die Dateiliste kommt häufig von
find; cpio wählt Dateien nicht automatisch rekursiv aus. - Archivierung ist nicht dasselbe wie Komprimierung. Für Komprimierung kann gzip nachgeschaltet werden.
- Ein Wechsel in das Quellverzeichnis vor
find .erzeugt meist portablere relative Pfade. - Bei wichtigen Daten müssen auch Eigentümer, Berechtigungen, Zeitstempel, Benutzerrechte und die Fähigkeiten des Ziel-Dateisystems berücksichtigt werden.
Als weiterführende Übung kannst du ein kleines Verzeichnis mit find archivieren, das Archiv in einem leeren Testordner entpacken und anschließend die Dateiliste, Inhalte und Metadaten vergleichen. Eine thematisch passende Referenz ist Dateien mit cpio archivieren.