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 --transformKonfigurationsoption 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 -TOption 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 -COption wird benötigt, damit tar weiß, wo sich die Dateien mit den relativen Namen befinden. Das --no-recursionFlag 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 findBefehl ziemlich leistungsfähig und Sie können ihn testen, indem Sie einfach den tarTeil 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 nurtardas Verzeichnis habe, enthält es es, aber mittar -czfihm werden nur die Dateien hinzugefügt.