web-dev-qa-db-fra.com

comment renommer les fichiers que vous placez dans une archive tar en utilisant linux 'tar'

J'essaie de créer une archive tar avec quelques fichiers, mais renommer ces fichiers dans l'archive. En ce moment, j'ai quelque chose comme ça:

tar -czvf file1 /some/path/to/file2 file3 etc

Mais je voudrais faire quelque chose comme:

tar -czvf file1=file1 /some/path/to/file2=file2 file3=path/to/renamedFile3 etc=etc

Où, une fois extrait dans le répertoire testDir, vous verriez les fichiers:

  • testDir/file1
  • testDir/file2
  • testDir/path/to/renamedFile3
  • testDir/etc

Comment puis-je faire ceci?

18
B T

Vous pouvez modifier les noms de fichiers (entre autres) avec --transform. Par exemple, pour créer une archive sur bande /tmp/foo.tar, mettre des fichiers /etc/profile et /etc/bash.bashrc en y renommant également profile en foo, vous pouvez effectuer les opérations suivantes:

tar --transform='flags=r;s|bar|foo|' -cf file.tar file1 file2 bar fubar /dir/*

Les résultats ci-dessus indiquent que bar est ajouté à file.tar comme foo.

L'indicateur r signifie que les transformations sont appliquées aux fichiers normaux uniquement. Pour plus d'informations, voir documentation tar GN .

Vous pouvez utiliser --transform plusieurs fois, par exemple:

tar --transform='flags=r;s|foo|bar|' --transform='flags=r;s|baz|woz|' -cf file.tar /some/dir/where/foo/is /some/dir/where/baz/is /other/stuff/* /dir/too
24
Sami Laine

Avec --transform, il n'est pas nécessaire de faire d'abord un testDir temporaire. Pour ajouter testDir/ à tout dans l'archive, faites correspondre l'ancre de début ^:

tar --transform "s|file3|path/to/renamedFile3|" \
    --transform "flags=r;s|^|testDir/|" \
    -czvf my_archive.tgz file1 /some/path/to/file2 file3 etc

L'indicateur r est essentiel pour empêcher la transformation de casser les cibles de lien symbolique dans l'archive (qui correspondent également à ^).

5
Rob Flickenger

Nous pouvons nous référer à l'homme tar, l'option -O Est le meilleur choix car les fichiers peuvent être écrits en sortie standard.

-O      (x, t modes only) In extract (-x) mode, files will be written to
         standard out rather than being extracted to disk.  In list (-t)
         mode, the file listing will be written to stderr rather than the
         usual stdout.

voici les exemples:

# 1. without -O
tar xzf 20170511162930.db.tar.gz
# result: 20170511162930.db

# 2. with -O
tar xzf 20170511162930.db.tar.gz -O > latest.db
# result: latest.db
3
Folyd

Après n'avoir aimé aucune solution que j'ai trouvée, je viens d'écrire tarlogs.py , qui vous permet de spécifier des noms arbitraires pour les entrées tar. Chaque entrée tar est construite à partir d'une (ou plusieurs) entrées régulières (ou gzippées). Vous pouvez également ajouter des répertoires, qui seront récursifs comme avec le tar normal. Donc dans votre cas,

tarlogs.py -o file1 -i /some/path/to/file2 -o file2 -i file3 -o path/to/renamedFile3 -o /etc >output.tar

(-o sans -i entrées utilise simplement le chemin de sortie comme entrée, sans renommer)

0
dan3