Comment tarer des fichiers avec un ordre trié?

10

Si vous tarun répertoire récursivement, il utilise simplement l'ordre des os readdir.

Mais dans certains cas, il est agréable de tarer les fichiers triés.

Quelle est la bonne façon de tarer un répertoire trié par ordre alphabétique?


Notez, pour les besoins de cette question, gnu-tar sur un système Linux typique est très bien.

ideasman42
la source
doublon possible ci-dessous, Vérifiez les liens ci-dessous unix.stackexchange.com/questions/120143/… superuser.com/questions/172367/…
Jaymin Dabhi
J'ai vu cela, mais je ne demande pas comment l'ordre est défini, je veux plutôt les trier.
ideasman42
Voir aussi unix.stackexchange.com/a/67018 pour trier une arborescence de répertoires par nom.
Stéphane Chazelas

Réponses:

17

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.

mikeserv
la source
8
--sorta été introduit dans tar version 1.28. --preserve-ordern'est pas pertinent pour cette question.
mhsmith
Je continue d'avoir des tar: Exiting with failure status due to previous errorserreurs. @mhsmith
alper
3

Avec zsh, au lieu de:

pax -w dir

Utilisation:

pax -dw dir dir/**/*(D)

Vous pouvez faire de même avec les versions récentes de bash -O globstar -O dotglobavec:

pax -dw dir/**

Ou des versions récentes de FIGNORE='@(.|..)' ksh93 -o globstaravec:

pax -dw dir dir/**

paxest la commande standard pour créer des tarfichiers. La sortie passe à stdout. Les globes shell sont triés par nom.

Si vous rencontrez une erreur de liste Arg trop longue , vous pouvez passer à:

printf '%s\0' dir dir/**/*(D) | pax -0dw

(toutes les paximplémentations ne sont cependant pas prises en charge -0).

Stéphane Chazelas
la source
2

tarlui-même ne peut pas le faire, vous devez donc le créer à partir d'une liste correctement ordonnée. En principe, vous pouvez alors utiliser tarl' -Toption de, 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 contenant des retours à la ligne (ce qui est autorisé), cela se cassera.

Une meilleure option consiste à utiliser cpiopour générer les fichiers car elle accepte une liste de noms de fichiers terminée par NUL et peut générer des fichiers tar.

Si votre tarcommande serait:

tar cvf /somedir/all.tar .

Ensuite, pour que cela soit trié par nom, vous devez faire (en supposant que GNU find et cpio):

find . -type f -print0 | sort -z | \
  cpio --create --null --format=ustar -O /somedir/all.tar

Cela présente cependant l'inconvénient que les sous-répertoires sont placés entre les noms de fichiers. Vous pouvez effectuer des astuces avec finds -printf0 en spécifiant le répertoire et les informations détaillées et le tri avec sort -nmais 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 pourriez probablement utiliser un petit programme python basé sur os.walk()pour générer l'ordre que vous souhaitez avec un contrôle total (profondeur d'abord, basé sur l'extension, etc.), mais si vous suivez cette voie, vous pouvez aussi bien laisser tomber cpioet écrire le tarfichier avec le tarfilemodule de python .

Anthon
la source
1
--null spécifie que -T prend des chaînes terminées par null.
2015