
Ich versuche, einen Projektordner mit versteckten Dateien und Ordnern zu archivieren und bekomme einen mit einem Stammeintrag von .
. Das ist ärgerlich. Normalerweise:
tar -czf $ARCHIVE_NAME -C $DIR .
erstellt ein Archiv wie
./package.json
./.git
./.gitignore
.
.
.
wobei ich möchte, dass die Wurzel des Archivs die eigentlichen Dateien und Ordner sind und kein .
Eintrag vorhanden ist. Wie
package.json
.git
.gitignore
.
.
.
Wie mache ich das?
* Bearbeiten *
Das folgende Bild kann zur Klärung dieser Frage hilfreich sein.
- Links ein mit dem GUI-Tool des Projekts erstelltes Archiv (von vor zwei Tagen).
- Rechts ein mit dem obigen
tar
Befehl erstelltes Archiv.
Beachten Sie die Leiste „Standort“. Das Archiv auf der rechten Seite sollte sein /
undnicht /./
.
Antwort1
./
bedeutet das aktuelle Verzeichnis. Ihre beiden Einträge sind identisch.
Die Angabe ./
vor der Datei bei der Auflistung des Archivs hilft bei der Handhabung von Dateien mit einem speziellen Namen. Ein Dateiname -file
wird angezeigt, der ./-file
die Verarbeitung durch ein zweites Tool zulässt.
Antwort2
Ändern Sie Ihren Befehl von
tar -czf $ARCHIVE_NAME -C $DIR .
Zu
tar -czf $ARCHIVE_NAME -C $DIR ./*
sollte funktionieren. Auf diese Weise sagen Sie nicht „Fügen Sie das Verzeichnis .
dem Archiv hinzu“, sondern „Fügen Sie alle diese Dateien im Verzeichnis .
dem Archiv hinzu“.
Antwort3
Dieser Befehl erstellt ein TAR-Archiv im aktuellen Verzeichnis ohne das führende ./
:
tar cf /some/tarfile.tar *
Natürlich werden keine Dateinamen berücksichtigt, die mit einem Punkt beginnen, was wahrscheinlich auch nicht das ist, was Sie wollen. Sie können zusätzliche Platzhalter hinzufügen, um diese abzufangen:
tar cf /some/tarfile.tar * .[a-zA-Z]*
Dies ist jedoch keine Allzwecklösung; Sie müssen wissen, welche Dateinamen sich im Verzeichnis befinden, damit Sie entsprechende Platzhalter erstellen können.
GNU Tar – das von den meisten Linux-Distributionen verwendet wird – verfügt über eine Funktion zum Transformieren von Dateinamen mithilfe sed
von Ausdrücken. Dadurch werden die aus Dateien entfernt, ./
während das Archiv erstellt wird:
tar cf /some/tarfile.tar --transform 's,^\./,,' .
Das resultierende Archiv enthält weiterhin einen Eintrag für das Verzeichnis "." selbst.
Einige Versionen von tar
können die Namen der zu tarnenden Dateien aus einer Datei lesen. Sie können diese Funktion zu folgendem Zweck nutzen:
ls -a | egrep -v '^\.\.?$' | tar cf - -T /dev/stdin
Diese Pipeline erstellt eine Liste aller Dateien im aktuellen Verzeichnis, entfernt die .
und ..
Einträge und leitet den Rest der Namen an weiter tar
. tar erstellt das Archiv aus den Dateinamen, die aus /dev/stdin
(seiner Standardeingabe) gelesen werden.