Ich mache normalerweise:
tar -czvf my_directory.tar.gz my_directory
Was ist, wenn ich nur alles (einschließlich aller versteckten Systemdateien) in my_directory aufnehmen möchte, aber nicht das Verzeichnis selbst? Ich will nicht:
my_directory
--- my_file
--- my_file
--- my_file
Ich möchte:
my_file
my_file
my_file
tar -czf
? In meinem Fall werden nur die Dateien und nicht das Verzeichnis gespeichert. Wenn ich nurtar
das Verzeichnis habe, enthält es es, aber mittar -czf
ihm werden nur die Dateien hinzugefügt.Antworten:
sollte den Job in einer Zeile erledigen. Es funktioniert auch gut für versteckte Dateien. "*" erweitert versteckte Dateien zumindest in bash nicht um die Pfadnamenerweiterung. Unten ist mein Experiment:
quelle
.
mit*
so der Befehl sein wird ,cd my_directory/ && tar -zcvf ../my_dir.tgz * && cd ..
dann wird es funktionieren wie erwartet.$ (cd my_directory/ && tar -zcvf ../my_dir.tgz .)
cd
in Verzeichnisse und aus zu gehen ist ziemlich lahm. Könnte zumindest Gebrauchpushd
undpopd
wenntar
hatte keine Fahnen wie-C
.Verwenden Sie den
-C
Schalter von Teer:Das
-C my_directory
weist tar an, das aktuelle Verzeichnis zu ändernmy_directory
, und.
bedeutet dann "das gesamte aktuelle Verzeichnis hinzufügen" (einschließlich versteckter Dateien und Unterverzeichnisse).Stellen Sie sicher, dass Sie dies tun,
-C my_directory
bevor Sie dies tun..
Andernfalls erhalten Sie die Dateien im aktuellen Verzeichnis.quelle
tar --create --file=foo.tar -C /etc passwd hosts -C /lib libc.a
" apl.jhu.edu/Misc/Unix-info/tar/tar_65.html Ich versuche immertar -czvf my_directory.tar.gz * -C my_directory
und das funktioniert nicht.-C
Lage ist wichtig! Verdammter Teer ...*
keine versteckten Dateien enthält (was die ursprüngliche Anforderung war).Sie können das Archiv auch wie gewohnt erstellen und extrahieren mit:
quelle
--strip-components
eine GNU-Erweiterung ist.Werfen Sie einen Blick auf
--transform
/--xform
, es gibt Ihnen die Möglichkeit, den Dateinamen zu massieren, wenn die Datei zum Archiv hinzugefügt wird:Der Transformationsausdruck ähnelt dem von
sed
, und wir können andere Trennzeichen als/
(,
im obigen Beispiel) verwenden.https://www.gnu.org/software/tar/manual/html_section/tar_52.html
quelle
file list too long
. Meine Lösung verhindert das und ist auch flexibler.--xform
mehrere Pfade mehrmals übergeben.TL; DR
Unter bestimmten Bedingungen (nur Dateien, Verzeichnisse und Symlinks archivieren):
Erläuterung
Das Folgende enthält leider ein übergeordnetes Verzeichnis
./
im Archiv:Sie können alle Dateien mithilfe der
--transform
Konfigurationsoption aus diesem Verzeichnis verschieben , das.
Verzeichnis selbst wird jedoch nicht entfernt . Es wird immer schwieriger, den Befehl zu zähmen.Sie können
$(find ...)
dem Befehl eine Dateiliste hinzufügen (wie in Magnus 'Antwort ), dies führt jedoch möglicherweise zu einem Fehler "Dateiliste zu lang". Der beste Weg ist, es mit der-T
Option von tar zu kombinieren , wie folgt :Grundsätzlich werden alle Dateien (
-type f
), Links (-type l
) und Unterverzeichnisse (-type d
) in Ihrem Verzeichnis-printf "%P\n"
aufgelistet , alle Dateinamen relativ mit verwendet und diese dann an den Befehl tar übergeben (Dateinamen werden von STDIN mit verwendet-T -
). Die-C
Option wird benötigt, damit tar weiß, wo sich die Dateien mit den relativen Namen befinden. Das--no-recursion
Flag ist so, dass tar nicht in Ordner zurückkehrt, die archiviert werden sollen (was zu doppelten Dateien führt).Wenn Sie mit Dateinamen etwas Besonderes tun müssen (Filtern, Folgen von Symlinks usw.), ist der
find
Befehl ziemlich leistungsfähig und Sie können ihn testen, indem Sie einfach dentar
Teil des obigen Befehls entfernen :Wenn Sie beispielsweise PDF-Dateien filtern möchten, fügen Sie hinzu
! -name '*.pdf'
Nicht-GNU-Fund
Der Befehl verwendet
printf
(in GNU verfügbarfind
)find
, um die Ergebnisse mit relativen Pfaden zu drucken. Wenn Sie jedoch keine GNU habenfind
, werden die Pfade dadurch relativiert (entfernt Eltern mitsed
):quelle
Diese Antwort sollte in den meisten Situationen funktionieren. Beachten Sie jedoch, wie die Dateinamen beispielsweise in der TAR-Datei gespeichert werden
./file1
und nicht nurfile1
. Ich stellte fest, dass dies Probleme verursachte, wenn diese Methode zum Bearbeiten von Tarballs verwendet wurde, die als Paketdateien in BuildRoot verwendet wurden .Eine Lösung besteht darin, einige Bash-Globs zu verwenden, um alle Dateien aufzulisten, mit Ausnahme der folgenden
..
:Dies ist ein Trick, den ich aus dieser Antwort gelernt habe .
Jetzt gibt tar einen Fehler zurück, wenn keine übereinstimmenden Dateien
..?*
oder vorhanden.[^.]*
sind, dies funktioniert jedoch weiterhin. Wenn der Fehler ein Problem ist (Sie überprüfen, ob ein Skript erfolgreich ist), funktioniert dies:Obwohl wir jetzt mit Shell-Optionen herumspielen, könnten wir entscheiden, dass es ordentlicher ist,
*
versteckte Dateien abzugleichen :Dies funktioniert möglicherweise nicht, wenn sich Ihre Shell
*
im aktuellen Verzeichnis befindet. Verwenden Sie daher alternativ:quelle
tar: start.sh: Cannot stat: No such file or directory
Dies passiert mit allen Dateien in meinem aktuellen Verzeichnis! Wie vermeide ich das?quelle
Wenn es sich um ein Unix / Linux-System handelt und Sie sich für versteckte Dateien interessieren (die von * übersehen werden), müssen Sie Folgendes tun:
Ich weiß nicht, wie versteckte Dateien unter Windows aussehen.
quelle
Ich würde die folgende Bash-Funktion vorschlagen (erstes Argument ist der Pfad zum Verzeichnis, zweites Argument ist der Basisname des resultierenden Archivs):
Sie können es folgendermaßen ausführen:
und es wird das Archiv
my_archive.tar.gz
im aktuellen Verzeichnis generiert . Es funktioniert mit versteckten (. *) Elementen und mit Elementen, deren Dateiname Leerzeichen enthält.quelle
Dieser hat bei mir funktioniert und enthält alle versteckten Dateien, ohne alle Dateien in einem Stammverzeichnis mit dem Namen "." wie in Tomoes Antwort :
quelle
Beispiel:
Bitte schön.
quelle
Das funktioniert bei mir.
Sie könnten auch verwenden
Im ersten Befehl gibt find eine Liste der Dateien und Unterverzeichnisse von my_dir zurück . Das Verzeichnis my_dir ist jedoch selbst als '.' In dieser Liste enthalten. Der Parameter -printf entfernt den vollständigen Pfad einschließlich des '.' und auch allecrlf Die PlatzIn der Formatzeichenfolge '% P' von printf verbleibt ein Rest in der Liste der Dateien und Unterverzeichnisse von my_dir und kann durch ein führendes Leerzeichen im Ergebnis des Befehls find angezeigt werden .
Dies ist für TAR kein Problem, aber wenn Sie dies beheben möchten, fügen Sie -mindepth 1 wie im zweiten Befehl hinzu.
quelle
Verwenden Sie pax.
Pax ist ein veraltetes Paket, macht aber die Arbeit perfekt und auf einfache Weise.
quelle
Der einfachste Weg, den ich gefunden habe:
cd my_dir && tar -czvf ../my_dir.tar.gz *
quelle
Behandelt Dateinamen sicher mit Leerzeichen oder anderen ungewöhnlichen Zeichen. Sie können
-name '*.sql'
dem Befehl find optional einen oder einen ähnlichen Filter hinzufügen , um die enthaltenen Dateien einzuschränken.quelle
Wenn es sich bei dem Ordner um mytemp handelt, werden alle Dateien im Ordner komprimiert und entfernt, aber in Ruhe gelassen
Sie können Ausschlussmuster angeben und auch angeben, dass nicht in Unterordner geschaut werden soll
quelle
quelle