Comment créer un fichier tar dans l'ordre alphabétique?

22

Je veux créer un fichier tar où tous les répertoires et fichiers sont traités par ordre alphabétique. C'est pour toute la hiérarchie des répertoires qui est en cours d'élaboration, donc cela commencerait par traiter le premier répertoire par ordre alphabétique, puis les sous-répertoires par ordre alphabétique, etc. J'ai parcouru la page de manuel et je ne trouve pas de commutateur pour cela.

J'admets, c'est moitié nouveauté, moitié légère optimisation. Je ne peux tout simplement pas croire qu'il n'y a pas de moyen facile de le faire. J'ai dû louper quelque chose.

Erick Robertson
la source
2
Pourquoi veux-tu faire cela?
matthias krull
C'est principalement parce que je veux savoir à quel point l'opération tar doit être terminée. Lorsque les fichiers sont chargés dans un ordre aléatoire, il n'y a aucun moyen de le savoir avec l'indicateur -v.
Erick Robertson
2
Ce n'est pas tout à fait vrai; Si vous dirigez la sortie vers un fichier et connaissez le nombre de fichiers (par exemple une commande de recherche rapide), vous pouvez comparer la sortie -v (wc -l) avec le nombre de fichiers de find pour avoir une idée de la progression ...
Slartibartfast
2
@matthiaskrull J'ai une raison non liée à cela, je crée un fichier OVA (qui est un fichier tar) pour déployer des machines virtuelles sur VMWare ESX Server. L'OVA a besoin de fichiers dans un ordre spécifique à l'intérieur (le premier fichier doit être un OVF, etc.).
xask
1
Il y a aussi une très bonne raison à cela: les performances sur un très gros fichier lorsque vous ne souhaitez en extraire qu'une partie. Étant donné que son ordre est par défaut aléatoire et que vous souhaitez extraire un fichier / répertoire, s'il est commandé, il sera plus rapide, sinon, il devra analyser toute l'archive avant de savoir qu'il est terminé.
StormByte

Réponses:

12

Slartibartfast est sur la bonne voie, mais le comportement par défaut de tar est de descendre dans les répertoires, vous pouvez donc obtenir plus d'une copie du même fichier inclus dans le fichier tar généré. Vous pouvez vérifier en faisant tar tf file.tar | sort La solution de contournement consiste à inclure l'option --no-recursion à tar. En outre, vous devriez être en mesure d'envoyer des noms de fichiers étranges en utilisant l' -print0 option de recherche, puis en utilisant l' --nulloption de tar. Le résultat final ressemble à ceci:

find paths -print0 | sort -z | tar cf tarfile.tar --no-recursion --null -T -

Vous pouvez vérifier l'ordre dans le fichier tar en utilisant tar tsf tarfile.tar. Bien que vous n'ayez probablement jamais besoin des options -print0, -z et --null sauf si vous savez que vous allez rencontrer un nom de fichier avec une nouvelle ligne incorporée, je ne l'ai jamais essayé.

Charlie Herron
la source
Excellente suggestion pour utiliser l'option --no-recursion, merci.
Erik
C'est la solution qui a fonctionné pour moi. J'ai un cas d'utilisation différent de celui qu'Erick et Google m'ont amené ici. Je collecte des instantanés au fil du temps de l'état complet d'un système distant. Les données sont extrêmement redondantes. Le tri de l'entrée tar par heure (les noms de fichiers ont un horodatage) améliore les performances du compresseur. Un test rapide montre une amélioration du facteur 2 (lzma2). De plus, je ne décompresse pas l'archive dans un système de fichiers, mais fais un traitement de flux sur les entrées tar. Un flux trié rend la sortie de débogage beaucoup plus agréable et présente d'autres avantages dans la chaîne de processus. +1
Johannes
5

L'ordre des fichiers dans le fichier tar n'a pas vraiment d'importance, car lorsque les fichiers sont extraits, le système de fichiers ne conservera pas l'ordre de toute façon.

Il n'y a pas de commutateur pour cela, mais si vous le vouliez vraiment, vous pourriez fournir à tar une liste de noms de fichiers dans l'ordre trié, et cela créerait le fichier tar avec l'ordre que vous lui donnez.

% tar cf tarfile tmp/diff.txt src/hellow.c junkimage.IMG barry/thegroup
% tar tf tarfile
tmp/diff.txt
src/hellow.c
junkimage.IMG
barry/thegroup
Kevin Panko
la source
2
ou simplement trier la sortie:tar tf tarfile | sort
Doug Harris
J'ai beaucoup trop de fichiers (20 000+) pour les spécifier tous sur la ligne de commande.
Erick Robertson du
4
L'ordre des fichiers dans le fichier tar importe si vous devez décompresser et afficher pendant le téléchargement.
Erik
Dépend du système de fichiers.
Thorbjørn Ravn Andersen
4

En supposant que vous n'ayez aucun fichier avec des retours à la ligne dans les noms:

find /source_directory -print | sort | tar -czf target.tgz -T -

Si cela ne fonctionne pas (jamais essayé, donc je ne sais pas - signifie stdin pour l'argument -T):

find /source_directory -print | sort > /tmp/temporary_file_list
tar -czf target.tgz -T /tmp/temporary_file_list

Il y a ensuite la question de savoir pourquoi. Mais parfois, il est plus facile de ne pas demander.

Slartibartfast
la source
2
find . -depth -print0 | sort -z | pax -wvd0 > file.tar

Pax est en quelque sorte le successeur POSIX de cpio et tar et le type de fusibles les meilleurs aspects des deux. Il écrit les archives tar (ustar) par défaut. Il effectue également la répartition et l'invite automatiques des supports et imprime un résumé une fois terminé.

Thomas Crescenzi
la source
0

Comme alternative à la réponse de @ CharlieHerron, si vous souhaitez uniquement conserver le contenu (fichiers, lien symbolique) et les métadonnées de dossier (par exemple, autorisation de dossier, mtime, etc.), vous souhaiterez peut-être filtrer les dossiers de findla sortie de.

find paths -not -type d -print 0 | sort -z | tar cf tarfile.tar --null -T -
user1202136
la source