TL;DR (keine ./
und keine ./file1
!)
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 Verzeichnis enthält leider ein übergeordnetes Verzeichnis ./
im Archiv:
tar -czf mydir.tgz -C /my/dir .
Sie können alle Dateien aus diesem Verzeichnis verschieben, indem Sie den Befehl --transform
Konfigurationsoption, aber das beseitigt nicht die .
Verzeichnis selbst. Es wird immer schwieriger, den Befehl zu zähmen.
Sie könnten verwenden $(find ...)
um dem Befehl eine Dateiliste hinzuzufügen (wie in Magnus' Antwort ), aber das führt möglicherweise zu einem "Dateiliste zu lang"-Fehler. Der beste Weg ist die Kombination mit tar's -T
Option, etwa so:
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Im Wesentlichen werden alle Dateien aufgelistet ( -type f
), Links ( -type l
) und Unterverzeichnisse ( -type d
) unter Ihrem Verzeichnis, machen Sie alle Dateinamen relativ mit -printf "%P\n"
und dann an den tar-Befehl übergeben (er nimmt die Dateinamen von STDIN mit -T -
). Die Website -C
ist erforderlich, damit tar weiß, wo sich die Dateien mit relativen Namen befinden. Die Option --no-recursion
Flag ist, damit tar nicht in Verzeichnisse rekursiert, die es archivieren soll (was zu doppelten Dateien führt).
Wenn Sie etwas Spezielles mit Dateinamen machen müssen (Filtern, Verfolgen von Symlinks usw.), kann der find
Befehl ist ziemlich mächtig, und Sie können ihn testen, indem Sie einfach die tar
Teil des obigen Befehls:
$ find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d
> textfile.txt
> documentation.pdf
> subfolder2
> subfolder
> subfolder/.gitignore
Wenn Sie zum Beispiel PDF-Dateien filtern wollen, fügen Sie ! -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
(verfügbar in GNU find
), die besagt find
um seine Ergebnisse mit relativen Pfaden zu drucken. Wenn Sie jedoch nicht über GNU find
funktioniert dies, um die Pfade relativ zu machen (entfernt die 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 -