Wie entferne ich den vollständigen Pfad, wenn ich eine Tar.gz-Komprimierung durchführe?

Wie entferne ich den vollständigen Pfad, wenn ich eine Tar.gz-Komprimierung durchführe?

Ich verwende diesen Befehl, um ein Verzeichnis mit dem Namen gnach Java-Code zu archivieren:

tar czf /a/b/c.tar.gz /e/f/g

Wenn die TAR-Datei c.tar.gzerstellt wird, finde ich einen vollständigen Pfad e/f/gund dann alle Dateien des gdarin enthaltenen Ordners. Ich möchte aber nur die Dateien unter dem Ordner im komprimierten Archiv sehen, gwenn ich es öffne. Wie entferne ich die Ordner /e/f/in der .tar.gz-Datei?

Antwort1

tar -czf /a/b/c.tar.gz -C /e/f/g .

Die -COption ermöglicht tardie Änderung des Arbeitsverzeichnisses, Sie müssen also nur hinzufügen ..

Sehen:Ändern des Arbeitsverzeichnisses – GNU- tarHandbuch

Antwort2

Diese Frage ist schon eine Weile her, aber ich konnte selbst immer noch nicht so einfach die Antwort zum Hinzufügen von Dateien und Ordnern mit bestimmten Suchkriterien mit relativen Pfaden finden.

Das Folgende deckt ein breiteres Thema ab als das, was gefragt wurde. Ich schreibe also die Lösung auf, die ich nach meinen Recherchen gefunden habe.

Nehmen wir an, Ihre $input_dirVariable verweist auf das gewünschte Verzeichnis und Sie möchten alle Ihre *.txtDateien in tarnen und komprimieren (mit gzip) ~/my_txt.tar.gz. Um ein gzipptes Tarball ohne gespeicherten Pfad (relativer Pfad) zu erstellen, verwenden Sie Folgendes:

find "$input_dir" -maxdepth 1 -type f -name "*.txt" -printf "%P\0" | tar --null --create --remove-files --gzip --file="$HOME/my_txt.tar.gz" --directory="$input_dir" --files-from=-

Lassen Sie es uns aufschlüsseln:

  • "$input_dir": Das Startverzeichnis. Ändern Sie es nach Belieben.
  • maxdepth 1: sucht nur im Stammverzeichnis dieses Verzeichnisses. Sie können es entfernen oder ändern, wenn Sie auf allen oder auf verschiedenen Ebenen suchen möchten.
  • -type f: nur nach Dateien suchen
  • -name "*.txt": entspricht den *.txt-Kriterien
  • -printf "%P": gibt den relativen Pfad aus (manpage: „Dateiname, wobei der Name des Startpunkts, unter dem die Datei gefunden wurde, entfernt wird“).
  • -printf "%P\0": Null beendet die relativen Pfadausgaben
  • | tar: Leiten Sie die Ausgaben an den nächsten Befehl weiter, der hier tar ist
  • --null: weist die nachfolgende --files-fromOption an, nullterminierte Namen zu lesen. Denken Sie daran, dass wir darum gebeten haben, findnullterminierte ( \0) Ausgaben anstelle von regulär \nterminierten Ausgaben zu erstellen. Dies dient dazu, alle möglichen Dateinamen mit Leerzeichen oder anderen Sonderzeichen abzudecken.
  • --create: Erstellen Sie die TAR-Datei. Gleich wie -c.
  • --remove-files: Ich verwende diese Option, um die Dateien zu entfernen, nachdem sie zum Tarball hinzugefügt wurden. Sie können es löschen.
  • --gzip: gzippt das Tarball. Gleicht -z.
  • --file="$HOME/my_txt.tar.gz": Die Ausgabedatei im gzippten Tarball-Format. Entspricht-f "$HOME/my_txt.tar.gz"
  • --directory="$input_dir": Dies bedeutet, dass tarjetzt in dieses Verzeichnis gewechselt wird. Jetzt wird nach den Dateinamen gesucht, die in diesem Verzeichnis übergeben werden (denken Sie daran, dass wir den relativen Pfad der Dateinamen zu diesem Ordner festgelegt haben). Gleich -C "$input_dir".
  • --files-from=/dev/stdin: Seine allgemeine Form ist --files-from=FILE. Diese Option mit der --nullOption weist an tar, dass die Namen in FILEdurch ASCII-NULL-Zeichen getrennt werden, anstatt durch den Zeilenvorschub ( ). Wir sagen auch , \ndass ( direkt von an weitergeleitet , anstatt von einer auf der Festplatte zu lesen). Gleich .FILEstdinfindtarFILE-T -

Einige der oben genannten Optionen können in Ein-Zeichen-Optionen geändert und kombiniert werden.

find "$input_dir" -maxdepth 1 -type f -name "*.txt" -printf "%P\0" | tar --null --remove-files -czf "$HOME/my_txt.tar.gz" -C "$input_dir" -T -

Sie können die Dateiliste mit -toder --listder Option überprüfen:

tar -tf "$HOME/my_txt.tar.gz"

Um die Dateien nun in das Verzeichnis $output_dir (das existiert) zu extrahieren, verwenden Sie Folgendes:

tar -xvzf "$HOME/my_txt.tar.gz" -C "$output_dir"

Die vOption ist ausführlich und Sie können sie auch während der Tarball-Erstellung hinzufügen.

Antwort3

Die Antwort von slhck erlaubt es nicht, die gewünschten Dateien zu filtern und schließt das gesamte Verzeichnis ein. Außerdem funktioniert Shell-Globbing mit dieser Verzeichnisoption nicht (siehe dieses hier beschriebene Problem:So funktioniert Tar-Globbing mit der Option „Verzeichnis ändern“).

shaheen g Antwort ist großartig, aber Nullbytes haben mich daran gehindert, den Befehl in einer Programmiersprache zu verwenden, da Nullbytes in einem String verboten sind. Also habe ich es angepasst, damit es ohne Nullbytes funktioniert, wenn Sie keine Dateinamen mit Leerzeichen verarbeiten müssen, AntwortHier.

tar -czf /a/b/c.tar.gz -C /e/f/g $(find /e/f/g -maxdepth 1 -type f -name "*.txt" -printf "%f\n")

oder

find /e/f/g -maxdepth 1 -type f -name "*.txt" -printf "%f\n" | tar -czf /a/b/c.tar.gz -C /e/f/g -T -

verwandte Informationen