TL; DR
find /my/dir/ -printf "%P\n" | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Unter bestimmten Bedingungen (nur Dateien, Verzeichnisse und Symlinks archivieren):
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Erläuterung
Das Folgende enthält leider ein übergeordnetes Verzeichnis ./
im Archiv:
tar -czf mydir.tgz -C /my/dir .
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 :
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
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 den tar
Teil des obigen Befehls entfernen :
$ find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d
> textfile.txt
> documentation.pdf
> subfolder2
> subfolder
> subfolder/.gitignore
Wenn Sie beispielsweise PDF-Dateien filtern möchten, fügen Sie hinzu ! -name '*.pdf'
$ find /my/dir/ -printf "%P\n" -type f ! -name '*.pdf' -o -type l -o -type d
> textfile.txt
> subfolder2
> subfolder
> subfolder/.gitignore
Nicht-GNU-Fund
Der Befehl verwendet printf
(in GNU verfügbar find
) find
, um die Ergebnisse mit relativen Pfaden zu drucken. Wenn Sie jedoch keine GNU haben find
, werden die Pfade dadurch relativiert (entfernt Eltern mit sed
):
find /my/dir/ -type f -o -type l -o -type d | sed s,^/my/dir/,, | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
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.