tar:メンバー名から先頭の `/ 'を削除します


137
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names

この問題を解決して/オンファイル名を保持するにはどうすればよいですか?


2
期待どおりに動作しないのは何ですか?

34
問題ありません。あなたはしたくない tarアーカイブにスラッシュをリードします。真剣に。システムルートにアーカイブを抽出する場合は、アーカイブを-C /抽出するタイミングを指定します。
シーフマスター

回答:


69

使用する--absolute-namesか、-Pこの機能を無効にするオプションを選択します。

tar fczP bkup.tar.gz /home/foo/

tar fcz bkup.tar.gz --absolute-names /home/foo

54
これは正しい答えですが、ほとんどの場合、これはあなたが望むものではないことに注意してください。完全なパスで抽出されるアーカイブが発生します。
rubo77

8
-C /@Marcusの回答で説明されているオプションを使用すると、それが主な目標である場合、STDERRメッセージがgit ridされます。
マットサンダース

1
@ rubo77がコメントしたように、通常、これはコマンドの期待される結果ではありません。
アルフレドカンベラ

3
ほとんどの場合、これはユーザーが望んでいるものではありません。なぜなら、ほとんどのユーザーは必要になるまでマニュアルを読んでいないからです(だれにもその時間がない)。ですから、少なくとも、あなたの答えを広げて、それが何の効果なのかを完全に確信していない限り、これをしないように人々に警告するのが賢明でしょう。特に回答として受け入れられています。
ムラデンB.

1
追加された@Toskanの例
-Barmar

89

これは実際には機能であり、問​​題ではありません。絶対的な場所を持つアーカイブはセキュリティ上のリスクです。攻撃者はこのようなアーカイブを使用して、ユーザーをだましてシステムの重要な場所にファイルをインストールさせる可能性があります。

はい、使用できます-P。しかし、tarがスラッシュを削除できるようにして、アーカイブのユーザーにルートディレクトリで明示的に抽出を行うように要求することの何が問題になっていますか?その後、彼らは意識的に重要なシステムの場所に影響を与えており、偶然にそれを行うことはできません。


5
機能が問題になる場合があります。からゼロ以外の終了ステータスをメールで送信するバックアップスクリプトを設定した後、このスレッドを見つけましたtar。この特定のメッセージはtar、ステータスが1で終了する原因となっていたため、tarこのメッセージがSTDERRに書き込まれたために、バックアップの成功時に誤った電子メールアラートを受信して​​いました。私はマーカスのソリューション@の自分自身の微調整バージョンを使用してこの問題を修正:cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
rubynorails

1
使用にはいくつかのユースケースがあると思います-P-たとえば、FUSEで何らかのファイルシステムスナップショット機能を提供している場合。cwdユーザーの視点からではなく、特定のディレクトリでスナップショットを展開したい場合があります。
-DIMMSum

81

あなたはSTDERRに印刷されている「メンバー名から`/」有数の削除」を取り除くためにしたいが、それでもタールが賢明デフォルトで行うように、これらの主要なスラッシュをオフのままにしたい場合は、私は優れたソリューションを見たここでコメント投稿のtimsoftによってを。

ソリューションでは、-Cオプションを使用してディレクトリをルート(/)に変更し、アーカイブするファイルツリーを先頭のスラッシュなしで指定します。相対パスのみが必要になったためです。これは通常のtar createコマンドと同じことを行いますが、ストリッピングは必要ありません。

tar fcz bkup.tar.gz -C / home/foo/

増分バックアップでは機能しません。しかし、良い答えです。
gajdipajti

tar c -C / home/foo/*シェルは変更されたルートを知らないため、シェル拡張(例えば)で示されるファイルをtarしたい場合にも動作しません。しかし、他の場合にはまだ良い答えです。
ボリス

1
-C /私には役に立たない、期間。それは私にとって標準エラーを防ぐものではありません。
Acumenus

3
@ABBは、-C /に続くパスが相対パスであることを確認します。
zurfyx 16

ユーザーがルートディレクトリに対するアクセス許可を持っていない場合、このアプローチは機能しますか?
ムラデンB.17年

31

1か月遅れましたが、(シェルスクリプトで)私の場合に最も適切な解決策は、親ディレクトリに移動してそこでコマンドを実行することでした。

cd /var/www/
tar -czf mysite.gz mysite

の代わりに:

tar -czf /var/www/mysite.gz /var/www/mysite

9
タール-zcvf mysite.gz -C / var / www / mysite /にこの利点は、あなたが任意のディレクトリからそれを実行することができるということです。確かにあなたは使用してそれを行っている可能性が
alfredocambera

ご協力ありがとうございました。これは私が必要としたものです。私はtarballに絶対パスを入れたくありませんでした。目的のフォルダーだけを望んでいました。
クリスティ

これはおそらく正しい答えとして受け入れられたはずです。
ムラデンB.

これが質問にどのように答えるかはわかりません。それは何か違うことです。………Like:Q:ロサンゼルスからニューヨークへはどうやって行くのですか?A:代わりにサンフランシスコに行きます。
Gマン

@ G-Manに同意します。これにより、まったく異なるディレクトリ構造を持つtarファイルが作成されます。場合によっては、そもそもそのディレクトリ構造が実際により適切ですが、質問には答えません。
ケビン・キーン

7

これは、ブルートフォースメソッドを使用して行った方法です2>&1 | grep -v "Removing leading"

例えば:

tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v  "Removing leading"

4
これの問題は、エラーコードが隠されることです。したがって、bashスクリプトでtarのエラーコードを確認する場合、成功時に0を返しません。
ブライアン

@staticx、エラーコードは関係なく0です。
Acumenus

1
@ABB 致命的なエラーでtarコマンドが返さ2れる場合があります。
ジェイト

1
@Brianでは、$ PIPESTATUSを使用して終了コードを取得できます。unix.stackexchange.com/questions/14270/…を
simpleuser

3

-C完全なパスでの圧縮を防ぐパスのみに使用してみてください:

root@server # tar fcz bkup.tar.gz -C /home/ foo/

2

私はこの問題を次の方法で解決しました。

cd /home/foo && tar czf ~/backup.tar.gz .

そうすれば、そもそもtarアーカイブに絶対パスを入れようとはしません。ファイルシステムのルートで展開したい場合は、

cd / && tar xzf backupt.tar.gz それを転送した後。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.