Pour un 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.
Vous voudrez probablement aussi regarder --preserve-order
.
Avec zsh
, au lieu de :
pax -w dir
Utiliser :
pax -dw dir dir/**/*(D)
Vous pouvez faire de même avec les versions récentes de bash -O globstar -O dotglob
avec :
pax -dw dir/**
Ou les versions récentes de FIGNORE='@(.|..)' ksh93 -o globstar
avec :
pax -dw dir dir/**
pax
est la commande standard pour faire tar
des dossiers. La sortie va sur stdout. Les globs du shell sont triés par nom.
Si vous tombez sur une liste Arg trop longue erreur, vous pouvez passer à :
printf '%s\0' dir dir/**/*(D) | pax -0dw
(pas tous pax
les implémentations prennent en charge -0
cependant).
tar
lui-même ne peut pas le faire, vous devez donc le créer à partir d'une liste correctement ordonnée. En principe, vous pourriez alors utiliser tar
est -T
option, mais il n'y a aucun moyen de spécifier que les noms de fichiers de cette liste doivent se terminer par NUL. Donc, si vous avez des noms de fichiers avec des retours à la ligne (ce qui est autorisé), cela va simplement casser.
Une meilleure option consiste à utiliser cpio
pour générer les fichiers car cela accepte une liste terminée par NUL de noms de fichiers et peut générer des fichiers tar.
Si votre tar
commande serait :
tar cvf /somedir/all.tar .
Ensuite, pour que cela soit trié par nom, vous devriez faire (en supposant que GNU find et cpio):
find . -type f -print0 | sort -z | \
cpio --create --null --format=ustar -O /somedir/all.tar
Cela a cependant l'inconvénient que les sous-répertoires sont placés entre les noms de fichiers. Vous pouvez faire des tours avec find
s -printf0 en spécifiant le répertoire et les informations de profondeur et en triant avec sort -n
mais cela influence également la façon dont les fichiers avec des numéros sont triés dans un répertoire.
Si ce qui précède n'est pas satisfaisant, vous pouvez probablement utiliser un petit programme python basé sur os.walk()
pour générer l'ordre que vous voulez avec un contrôle total (profondeur d'abord, basé sur l'extension, etc.), mais si vous suivez cette voie, vous pourriez aussi bien laisser tomber cpio
et écrivez le tar
fichier avec tarfile
de python module.