Für ein GNU tar
:
--sort=ORDER
Specify the directory sorting order when reading directories.
ORDER may be one of the following:
`none'
No directory sorting is performed. This is the default.
`name'
Sort the directory entries on name. The operating system may
deliver directory entries in a more or less random order, and
sorting them makes archive creation reproducible.
`inode'
Sort the directory entries on inode number. Sorting
directories on inode number may reduce the amount of disk
seek operations when creating an archive for some file
systems.
Sie werden sich wahrscheinlich auch --preserve-order
ansehen wollen .
Mit zsh
, statt:
pax -w dir
Verwendung:
pax -dw dir dir/**/*(D)
Sie können dasselbe mit neueren Versionen von bash -O globstar -O dotglob
tun mit:
pax -dw dir/**
Oder neuere Versionen von FIGNORE='@(.|..)' ksh93 -o globstar
mit:
pax -dw dir dir/**
pax
ist der Standardbefehl, um tar
zu erstellen Dateien. Die Ausgabe geht nach stdout. Shell-Globs werden nach Namen sortiert.
Wenn Sie auf eine Arg-Liste zu lang stoßen Fehler, können Sie ändern zu:
printf '%s\0' dir dir/**/*(D) | pax -0dw
(nicht alle pax
Implementierungen unterstützen -0
obwohl).
tar
selbst kann dies nicht, also müssen Sie es aus einer korrekt geordneten Liste erstellen. Im Prinzip könnten Sie dann tar
verwenden ist -T
Option, aber es gibt keine Möglichkeit anzugeben, dass die Dateinamen in dieser Liste NUL-terminiert sein sollen. Wenn Sie also Dateinamen mit Zeilenumbrüchen haben (was erlaubt ist), wird dies einfach brechen.
Eine bessere Option ist die Verwendung von cpio
um die Dateien zu generieren, da dies eine NUL-terminierte Liste von Dateinamen akzeptiert und tar-Dateien generieren kann.
Wenn Ihr tar
Befehl wäre:
tar cvf /somedir/all.tar .
Damit dies nach Namen sortiert werden kann, müssten Sie Folgendes tun (unter der Annahme von GNU find und cpio):
find . -type f -print0 | sort -z | \
cpio --create --null --format=ustar -O /somedir/all.tar
Dies hat jedoch den Nachteil, dass Unterverzeichnisse zwischen Dateinamen platziert werden. Mit find
kannst du Tricks machen s -printf0 Angabe des Verzeichnisses und der Tiefeninformationen und Sortierung mit sort -n
aber das beeinflusst auch, wie Dateien mit Nummern innerhalb eines Verzeichnisses sortiert werden.
Wenn das obige nicht zufriedenstellend ist, könnten Sie wahrscheinlich ein kleines Python-Programm verwenden, das auf os.walk()
basiert um die gewünschte Reihenfolge mit voller Kontrolle zu generieren (Tiefe zuerst, basierend auf Erweiterung usw.), aber wenn Sie diesen Weg gehen, können Sie cpio
genauso gut löschen und schreiben Sie die tar
aus Datei mit Pythons tarfile
Modul.