
Ich verwende diesen Befehl, um ein Verzeichnis mit dem Namen g
nach Java-Code zu archivieren:
tar czf /a/b/c.tar.gz /e/f/g
Wenn die TAR-Datei c.tar.gz
erstellt wird, finde ich einen vollständigen Pfad e/f/g
und dann alle Dateien des g
darin enthaltenen Ordners. Ich möchte aber nur die Dateien unter dem Ordner im komprimierten Archiv sehen, g
wenn 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 -C
Option ermöglicht tar
die Änderung des Arbeitsverzeichnisses, Sie müssen also nur hinzufügen .
.
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_dir
Variable verweist auf das gewünschte Verzeichnis und Sie möchten alle Ihre *.txt
Dateien 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-from
Option an, nullterminierte Namen zu lesen. Denken Sie daran, dass wir darum gebeten haben,find
nullterminierte (\0
) Ausgaben anstelle von regulär\n
terminierten 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, dasstar
jetzt 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--null
Option weist antar
, dass die Namen inFILE
durch ASCII-NULL-Zeichen getrennt werden, anstatt durch den Zeilenvorschub ( ). Wir sagen auch ,\n
dass ( direkt von an weitergeleitet , anstatt von einer auf der Festplatte zu lesen). Gleich .FILE
stdin
find
tar
FILE
-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 -t
oder --list
der 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 v
Option 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 -