GNU/Linux >> Tutoriels Linux >  >> Linux

Comment tarer les fichiers avec un ordre trié ?

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.


Linux
  1. Comment chiffrer des fichiers avec gocryptfs sous Linux

  2. Comment extraire des fichiers tar dans un répertoire spécifique ou différent sous Linux

  3. Fichiers Cat avec répertoire ?

  4. Comment compresser un répertoire sous Linux

  5. Comment mettre en miroir un répertoire avec wget sans créer de répertoires parents ?

Comment compter les fichiers dans le répertoire sous Linux

Comment tarer des types de fichiers spécifiques (extensions) dans un répertoire

Comment compter les fichiers dans le répertoire sous Linux

Premiers pas avec la commande Tar

Comment télécharger des fichiers avec FileZilla

Comment renommer tous les fichiers avec des caractères spéciaux et des espaces dans un répertoire ?