web-dev-qa-db-ja.com

Linux 'tar'を使用してtarアーカイブに入れたファイルの名前を変更する方法

いくつかのファイルでtarアーカイブを作成しようとしていますが、アーカイブ内のファイルの名前を変更しています。今私はこのようなものを持っています:

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

しかし、私は次のようなことをしたいと思います:

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

ここで、ディレクトリtestDirに抽出すると、次のファイルが表示されます。

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

これどうやってするの?

18
B T

ファイル名は(特に)--transformで変更できます。たとえば、テープアーカイブ/tmp/foo.tarを作成し、ファイル/etc/profile/etc/bash.bashrcをその中に入れながら、profilefooに名前変更するには、次のようにします。以下:

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

上記の結果、barfile.tarfooとして追加されます。

rフラグは、変換が通常のファイルにのみ適用されることを意味します。詳細は GNU tarドキュメント を参照してください。

--transformは複数回使用できます。次に例を示します。

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

--transform、一時的なtestDirを最初に作成する必要はありません。先頭にtestDir/アーカイブ内のすべてに、最初のアンカーに一致^:

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

rフラグは、変換がアーカイブ内のシンボリックリンクターゲット(^にも一致)を壊さないようにするために重要です。

5
Rob Flickenger

tar-Oオプションは、ファイルを標準出力に書き込むことができるため、最良の選択です。

-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.

次に例を示します。

# 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

私が見つけたソリューションが気に入らなくなった後、私は tarlogs.py と書いただけです。これにより、tarエントリに任意の名前を指定できます。各tarエントリは、1つ(または複数)の通常の(またはgzipされた)入力から構成されます。通常のtarと同様に再帰されるディレクトリを追加することもできます。だからあなたの場合、

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

-o なしで -i入力は、名前を変更せずに、出力パスを入力として使用するだけです)

0
dan3