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:
Comment puis-je faire ceci?
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
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 à ^).
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
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)