it-swarm.com.de

tar: Fügt alle Dateien und Verzeichnisse im aktuellen Verzeichnis einschließlich .svn usw. hinzu

Ich versuche ein tar.gz-Verzeichnis zu verwenden und zu verwenden

tar -czf workspace.tar.gz *

Das resultierende tar enthält .svn-Verzeichnisse in Unterverzeichnissen, jedoch NICHT im aktuellen Verzeichnis (da * nur zu "sichtbaren" Dateien erweitert wird, bevor es an tar übergeben wird

Ich versuchte zu 

tar -czf workspace.tar.gz . stattdessen bekomme ich eine Fehlermeldung, weil '.' hat sich beim Lesen geändert:

tar: ./workspace.tar.gz: file changed as we read it

Gibt es einen Trick, bei dem * mit allen Dateien (einschließlich Punkt-Präfix) in einem Verzeichnis übereinstimmt?

(mit bash unter Linux SLES-11 (2.6.27.19)

66
Micha

Erstellen Sie die tar-Datei nicht in dem Verzeichnis, das Sie packen:

tar -czf /tmp/workspace.tar.gz .

macht den Trick, außer dass die Dateien beim Entpacken im gesamten aktuellen Verzeichnis entpackt werden. Besser zu tun:

cd ..
tar -czf workspace.tar.gz workspace

oder wenn Sie den Namen des Verzeichnisses nicht kennen, in dem Sie sich befanden:

base=$(basename $PWD)
cd ..
tar -czf $base.tar.gz $base

(Dies setzt voraus, dass Sie den Symlinks nicht gefolgt sind, um dorthin zu gelangen, wo Sie sich befinden, und dass die Shell nicht versucht, Sie durch einen Rücksprung durch einen Symlink zu hinterfragen - bash ist diesbezüglich nicht vertrauenswürdig. Wenn Sie sich darum sorgen müssen verwenden Sie cd -P .., um ein physisches Änderungsverzeichnis auszuführen. Dumm, dass es in meinen Augen nicht das Standardverhalten ist - zumindest verwirrend für diejenigen, für die cd .. nie eine alternative Bedeutung hatte.)


Ein Kommentar in der Diskussion sagt:

Ich muss das oberste Verzeichnis ausschließen und die tar [...] muss im Basisverzeichnis abgelegt werden.

Der erste Teil des Kommentars ist nicht sinnvoll. Wenn die tar-Datei das aktuelle Verzeichnis enthält, wird sie nicht erstellt, wenn Sie eine Datei aus diesem Archiv extrahieren, da das aktuelle Verzeichnis definitionsgemäß bereits vorhanden ist (außer in sehr ungewöhnlichen Umständen) ).

Der zweite Teil des Kommentars kann auf zwei Arten behandelt werden:

  1. Entweder: Erstellen Sie die Datei an einem anderen Ort - /tmp ist ein möglicher Speicherort - und verschieben Sie sie anschließend wieder an den ursprünglichen Speicherort.
  2. Oder: Wenn Sie GNU Tar verwenden, verwenden Sie die Option --exclude=workspace.tar.gz. Die Zeichenfolge hinter dem = ist ein Muster - das Beispiel ist das einfachste Muster - eine exakte Übereinstimmung. Sie müssen möglicherweise --exclude=./workspace.tar.gz angeben, wenn Sie entgegen den Empfehlungen im aktuellen Verzeichnis arbeiten. Möglicherweise müssen Sie --exclude=workspace/workspace.tar.gz angeben, wenn Sie, wie vorgeschlagen, eine Ebene höher arbeiten. Wenn Sie mehrere tar-Dateien ausschließen möchten, verwenden Sie '*' wie in --exclude=./*.gz.
52

Wenn Sie wirklich nicht das Top-Verzeichnis in das Tarball aufnehmen möchten (und das ist im Allgemeinen eine schlechte Idee):

tar czf workspace.tar.gz -C /path/to/workspace .
42
rkhayrov

Es gibt ein paar Schritte, die zu tun sind:

  1. Ersetzen Sie * durch ., um auch versteckte Dateien einzuschließen.
  2. Um das Archiv im selben Verzeichnis zu erstellen, kann mit --exclude=workspace.tar.gz das Archiv selbst ausgeschlossen werden.
  3. Um den tar: .: file changed as we read it-Fehler zu verhindern, wenn das Archiv noch nicht erstellt wurde, stellen Sie sicher, dass es vorhanden ist (z. B. mit touch). Daher stimmt das --exclude mit dem Archivdateinamen überein. (Es stimmt nicht überein, dass die Datei nicht existiert.)

Kombiniert dies ergibt das folgende Skript:

touch workspace.tar.gz
tar -czf workspace.tar.gz --exclude=workspace.tar.gz .
19
Veger

im Verzeichnis, das komprimiert werden soll (aktuelles Verzeichnis), versuchen Sie Folgendes:

tar -czf workspace.tar.gz . --exclude=./*.gz
17
empugandring

Sie können das .-Formular mit --exclude reparieren:

tar -czf workspace.tar.gz --exclude=workspace.tar.gz .
6
caf

Sie können die versteckten Verzeichnisse einschließen, indem Sie ein Verzeichnis zurückgehen und Folgendes tun:

cd ..
tar -czf workspace.tar.gz workspace

Angenommen, das Verzeichnis, das Sie für gzip verwenden wollten, wurde als Arbeitsbereich bezeichnet.

6
bramp

Update: Ich habe ein Update für den OP-Kommentar hinzugefügt.

tar -czf workspace.tar.gz .

ändert zwar das aktuelle Verzeichnis, aber warum sollte man die Datei nicht woanders ablegen?

tar -czf somewhereelse/workspace.tar.gz .
mv somewhereelse/workspace.tar.gz . # Update
4
Peter Jaric

Eigentlich liegt das Problem bei den Komprimierungsoptionen. Der Trick besteht darin, dass das Teerergebnis zu einem Kompressor geleitet wird, anstatt die integrierten Optionen zu verwenden. Dies kann übrigens auch zu einer besseren Komprimierung führen, da Sie zusätzliche Komprimierungsoptionen einstellen können.

Minimaler Teer:

tar --exclude=*.tar* -cf workspace.tar .

Pfeifen Sie zu einem Kompressor Ihrer Wahl. Dieses Beispiel ist ausführlich und verwendet xz mit maximaler Komprimierung:

tar --exclude=*.tar* -cv . | xz -9v >workspace.tar.xz

Die Lösung wurde auf Ubuntu 14.04 und Cygwin unter Windows 7 getestet. __ Es ist eine Community-Wiki-Antwort.

4
s3v1

Eine gute Frage. In ZSH können Sie den Globbing-Modifizierer (D) verwenden, der für "dotfiles" steht. Vergleichen Sie:

ls $HOME/*

und

ls $HOME/*(D)

Dies schließt die speziellen Verzeichniseinträge . und .. korrekt aus. In Bash können Sie .* verwenden, um die Punktdateien explizit einzuschließen:

ls $HOME/* $HOME/.*

Aber dazu gehören auch . und .., also nicht das, wonach Sie gesucht haben. Ich bin sicher, dass es auch eine Möglichkeit gibt, * in Bash mit dotfiles abzugleichen.

1
loevborg
tar -czf workspace.tar.gz .??* *

Durch die Angabe von .??* werden "Punkt" -Dateien und -Verzeichnisse eingeschlossen, die nach dem Punkt mindestens 2 Zeichen enthalten. Der Nachteil ist, dass Dateien/Verzeichnisse mit einem einzelnen Zeichen nach dem Punkt nicht eingefügt werden, z. B. .a, falls vorhanden.

0
Scott Thomson

Hatte selbst eine ähnliche Situation. Ich denke, es ist am besten, das tar an anderer Stelle zu erstellen und dann mit -C das Basisverzeichnis für die komprimierten Dateien anzugeben. Beispiel:

tar -cjf workspace.tar.gz -C <path_to_workspace> $(ls -A <path_to_workspace>)

Auf diese Weise müssen Sie Ihr eigenes Tarfile nicht ausschließen. Wie in anderen Kommentaren erwähnt, listet -A alle versteckten Dateien auf.

0
ginin

Eine weitere Lösung, vorausgesetzt die Anzahl der Elemente im Ordner ist nicht groß:

tar -czf workspace.tar.gz `ls -A`

(ls -A druckt normale und versteckte Dateien, aber nicht "." und ".." wie ls -a).

0
Joachim Wagner

Das Problem bei den meisten Lösungen, die hier bereitgestellt werden, ist, dass tar am Anfang jedes Eintrags ./ enthält. Dies führt dazu, dass das .-Verzeichnis vorhanden ist, wenn es über den GUI-Kompressor geöffnet wird. Was ich am Ende getan habe, ist:

ls -1A | xargs -d "\n" tar cfz my.tar.gz

Wenn Sie my.tar.gz bereits im aktuellen Verzeichnis haben, möchten Sie dies vielleicht herausfinden:

ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz

Seien Sie sich bewusst, dass dass xargs eine bestimmte Grenze hat (siehe xargs --show-limits). Diese Lösung funktioniert also nicht, wenn Sie versuchen, ein Paket zu erstellen, das viele Einträge (Verzeichnisse und Dateien) für ein Verzeichnis enthält, das Sie tarieren möchten.

0
Ellis

Wenn Speicherplatz kein Problem ist, kann dies auch sehr einfach sein: 

mkdir backup
cp -r ./* backup
tar -zcvf backup.tar.gz ./backup
0
bicycle