Ich versuche ein Verzeichnis zu tar.gz und benutze
tar -czf workspace.tar.gz *
Das resultierende tar enthält .svn
Verzeichnisse in Unterverzeichnissen, jedoch NICHT im aktuellen Verzeichnis (da *
es nur auf "sichtbare" Dateien erweitert wird, bevor es an tar übergeben wird
Ich versuchte zu
tar -czf workspace.tar.gz .
stattdessen aber dann bekomme ich einen Fehler weil '.' hat sich beim Lesen geändert:
tar: ./workspace.tar.gz: file changed as we read it
Gibt es dafür einen Trick? *
allen Dateien (einschließlich Punktpräfix) in einem Verzeichnis entspricht?
(Verwenden von Bash unter Linux SLES-11 (2.6.27.19)
linux
bash
design-patterns
tar
Micha
quelle
quelle
Antworten:
Erstellen Sie die TAR-Datei nicht in dem Verzeichnis, das Sie packen:
macht den Trick, außer dass die Dateien beim Entpacken im gesamten aktuellen Verzeichnis extrahiert werden. Besser zu tun:
oder, wenn Sie den Namen des Verzeichnisses, in dem Sie sich befanden, nicht kennen:
(Dies setzt voraus, dass Sie keinen Symlinks gefolgt sind, um dorthin zu gelangen, wo Sie sich befinden, und dass die Shell nicht versucht, Sie zu erraten, indem sie durch einen Symlink rückwärts springt.
bash
Dies ist in dieser Hinsicht nicht vertrauenswürdig. Wenn Sie sich darüber Sorgen machen müssen, Verwenden Siecd -P ..
, um ein physisches Änderungsverzeichnis zu erstellen. Dumm, dass es aus meiner Sicht nicht das Standardverhalten ist - zumindest verwirrend für diejenigen, für die escd ..
nie eine alternative Bedeutung gab.)Ein Kommentar in der Diskussion sagt:
Der erste Teil des Kommentars ist wenig sinnvoll. Wenn die TAR-Datei das aktuelle Verzeichnis enthält, wird sie beim Extrahieren der Datei aus diesem Archiv nicht erstellt, da das aktuelle Verzeichnis per Definition bereits vorhanden ist (außer unter sehr seltsamen Umständen) ).
Der zweite Teil des Kommentars kann auf zwei Arten behandelt werden:
/tmp
ist ein möglicher Speicherort - und verschieben Sie sie nach Abschluss wieder an den ursprünglichen Speicherort.--exclude=workspace.tar.gz
Option. Die Zeichenfolge nach dem=
ist ein Muster - das Beispiel ist das einfachste Muster - eine genaue Übereinstimmung. Möglicherweise müssen Sie angeben,--exclude=./workspace.tar.gz
ob Sie entgegen den Empfehlungen im aktuellen Verzeichnis arbeiten. Möglicherweise müssen Sie angeben,--exclude=workspace/workspace.tar.gz
ob Sie wie vorgeschlagen eine Ebene bearbeiten. Wenn Sie mehrere TAR-Dateien ausschließen möchten, verwenden Sie '*
' wie in--exclude=./*.gz
.quelle
Wenn Sie das Top-Verzeichnis wirklich nicht in den Tarball aufnehmen möchten (und das ist im Allgemeinen eine schlechte Idee):
quelle
Acdrtux
oder einer der langen Funktionsnamen. Einem Funktionsbuchstaben muss kein Präfix vorangestellt-
werden und kann mit anderen Einzelbuchstabenoptionen kombiniert werden.Es sind einige Schritte zu unternehmen:
*
durch.
, um auch versteckte Dateien einzuschließen.--exclude=workspace.tar.gz
kann a verwendet werden, um das Archiv selbst auszuschließen.tar: .: file changed as we read it
Fehler zu vermeiden , wenn das Archiv noch nicht erstellt wurde, stellen Sie sicher, dass es vorhanden ist (z. B. usingtouch
), damit --exclude mit dem Archivdateinamen übereinstimmt . (Es stimmt nicht überein, die Datei existiert nicht)Kombiniert ergibt dies das folgende Skript:
quelle
--verbose
, etwa so:-czvf
.im Verzeichnis wollen komprimieren (aktuelles Verzeichnis) versuchen Sie dies:
quelle
.gz
Dateien im Verzeichnis aus.Sie können die versteckten Verzeichnisse einschließen, indem Sie ein Verzeichnis zurückgehen und Folgendes tun:
Angenommen, das Verzeichnis, das Sie gzipen möchten, heißt Arbeitsbereich.
quelle
tar -czf /path/to/where/you/do/have/permission/workspace.tar.gz workspace
-
vor demczf
herausnehmen, damit es funktioniert. Ansonsten wurde eineCannot stat: No such file or directory
Fehlermeldung angezeigt.Sie können das
.
Formular mithilfe von--exclude
:quelle
Update: Ich habe einen Fix für den Kommentar des OP hinzugefügt.
wird zwar das aktuelle Verzeichnis ändern, aber warum nicht die Datei woanders platzieren?
quelle
Eigentlich liegt das Problem bei den Komprimierungsoptionen. Der Trick besteht darin, das Teerergebnis zu einem Kompressor zu leiten, anstatt die integrierten Optionen zu verwenden. Dies kann übrigens auch zu einer besseren Komprimierung führen, da Sie zusätzliche Komprimierungsoptionen festlegen können.
Minimaler Teer:
Rohr zu einem Kompressor Ihrer Wahl. Dieses Beispiel ist ausführlich und verwendet xz mit maximaler Komprimierung:
Die Lösung wurde unter Ubuntu 14.04 und Cygwin unter Windows 7 getestet. Es handelt sich um eine Community-Wiki-Antwort. Sie können sie also jederzeit bearbeiten, wenn Sie einen Fehler entdecken.
quelle
Eine gute Frage. In ZSH können Sie den Globbing-Modifikator verwenden
(D)
, der für "Dotfiles" steht. Vergleichen Sie:und
Dies schließt die speziellen Verzeichniseinträge
.
und korrekt aus..
. In Bash können Sie.*
die Punktedateien explizit einschließen:Aber dazu gehört auch
.
und..
, also ist es nicht das, wonach Sie gesucht haben. Ich bin mir sicher, dass es auch eine Möglichkeit gibt,*
Match-Dotfiles in Bash zu erstellen.quelle
.??*
in Bash, um alle Punktdateien nicht.
und abzugleichen..
. Das bekommt keine Einzelzeichen-Punktdateien (wie.a
). Verwenden Sie die komplizierteren, um auch diese zu erhalten.[^.]*
.Das Problem mit den meisten hier angebotenen Lösungen ist, dass Teer
./
zu Beginn jedes Eintrags enthält. Dies führt dazu, dass.
beim Öffnen über den GUI-Kompressor ein Verzeichnis vorhanden ist. Am Ende habe ich also Folgendes getan:ls -1A | xargs -d "\n" tar cfz my.tar.gz
Wenn Sie bereits ein
my.tar.gz
aktuelles Verzeichnis haben, möchten Sie dies möglicherweise überprüfen:ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz
Sich bewusst sein , dass xargs hat bestimmte Grenze (siehe
xargs --show-limits
). Diese Lösung würde also nicht funktionieren, wenn Sie versuchen, ein Paket zu erstellen, das viele Einträge (Verzeichnisse und Dateien) in einem Verzeichnis enthält, das Sie tarieren möchten.quelle
Eine weitere Lösung, vorausgesetzt, die Anzahl der Elemente im Ordner ist nicht groß:
(
ls -A
druckt normale und versteckte Dateien, aber nicht "." und ".." wiels -a
).)quelle
Die Angabe
.??*
umfasst "Punkt" -Dateien und -Verzeichnisse mit mindestens 2 Zeichen nach dem Punkt. Der Nachteil ist, dass keine Dateien / Verzeichnisse mit einem einzelnen Zeichen nach dem Punkt enthalten sind, z. B..a
falls vorhanden.quelle
Wenn der Speicherplatz kein Problem darstellt, kann dies auch sehr einfach sein:
quelle
Hatte selbst eine ähnliche Situation. Ich denke, es ist am besten, den Teer an anderer Stelle zu erstellen und dann -C zu verwenden, um tar das Basisverzeichnis für die komprimierten Dateien mitzuteilen. Beispiel:
Auf diese Weise müssen Sie Ihr eigenes Tarfile nicht ausschließen. Wie in anderen Kommentaren erwähnt, listet -A versteckte Dateien auf.
quelle
Verwenden
find
ist wahrscheinlich der einfachste Weg:find . -maxdepth 1
findet alle Dateien / Verzeichnisse / Symlinks / etc im aktuellen Verzeichnis und führt den von angegebenen Befehl aus-exec
. Die{}
im Befehl bedeutet , dass die Dateiliste hier\+
angezeigt wird und bedeutet, dass der Befehl wie folgt ausgeführt wird:anstatt
quelle