STDINを介して任意のデータを渡し、通常のファイルのように圧縮する方法を探しています。
私はこれを試しました
$ echo test | tar -cf test.tar /dev/stdin
test.tar
これにより、内容を含むファイルが提供されますdev/stdin
。ファイルstdin
はリンクです/proc/self/fd/0
。
私が望むのは、dev/stdin
TARファイル内にtextを含む一般的なファイルがあるということですtest
。次のような状況でも同様の状況が発生します。
$ tar -cf test.tar <(echo test)
しかし、名前は異なります。
これは可能ですか?
ベストアンサー1
私の考えでは、ここでやりたいことができないと思います。アプローチの問題は、tar
ファイルとディレクトリツリーを処理し、次のコマンドを提供しないことです。
$ echo test | tar -cf test.tar /dev/sdtin
次のサブシェルを使用して一時ファイルの文字列を「ラップ」しようとしても、
$ tar -cf test.tar <(echo test)
コンテンツがまだ TAR 圧縮に次の一時ファイル記述子を使用していることを確認できます。
$ tar tvf test.tar
lr-x------ vagrant/vagrant 0 2018-08-04 23:52 dev/fd/63 -> pipe:[102734]
文字列を圧縮したい場合は、ファイルコンテキストに入れる必要があります。したがって、次のようにする必要があります。
$ echo "test" > somefile && tar -cf /tmp/test.tar somefile
TARファイルにそのファイルが存在することを確認できます。
$ tar tvf /tmp/test.tar
-rw-rw-r-- vagrant/vagrant 5 2018-08-05 00:00 somefile
tarを使用したデータのコピー
長い間Unixを使用してきたほとんどの人は、おそらく次のようなパターンを見たことがあります。
$ (cd /; tar cf - .)|(cd /mnt/newroot; tar pxvf -)
私は過去にある場所から別の場所にデータをコピーするためにこれを使用しました。 SSH経由でも使用できます。他の方法については、U&L Q&Aで次のように議論されています。busyboxを使用したルートディレクトリツリーの複製。
バックアップ/
ハードドライブ全体をバックアップしたい場合でも、この方法を使用できます。
$ sudo tar -cvpzf backup.tar.gz --exclude=/backup.tar.gz --one-file-system /