ディレクトリをtarしますが、アーカイブに完全な絶対パスを保存しません 質問する

ディレクトリをtarしますが、アーカイブに完全な絶対パスを保存しません 質問する

バックアップ シェル スクリプトの一部に次のコマンドがあります。

tar -cjf site1.bz2 /var/www/site1/

アーカイブの内容を一覧表示すると、次のようになります。

tar -tf site1.bz2
var/www/site1/style.css
var/www/site1/index.html
var/www/site1/page2.html
var/www/site1/page3.html
var/www/site1/images/img1.png
var/www/site1/images/img2.png
var/www/site1/subdir/index.html

しかし、抽出を簡素化し、無駄な一定のディレクトリ構造を避けるために、アーカイブ内のディレクトリとファイル名から の部分を削除したいと思います/var/www/site1。 バックアップされた Web サイトを、Web データが の下に保存されていない場所に抽出することになるかどうかはわかりません/var/www

上記の例では、次のようになります。

tar -tf site1.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html

そのため、抽出時にファイルは現在のディレクトリに抽出され、後で抽出したファイルを移動する必要がなくなり、サブディレクトリ構造が保持されます。

ウェブ上や他の場所では、tar とバックアップに関する質問がすでにたくさんありますstackoverflowが、そのほとんどは、サブディレクトリ構造全体を削除 (フラット化) するか、名前の最初の / を追加または削除する (抽出時に正確に何が変更されるかはわかりません) ように求めるものですが、もうそうではありません。

あちこちで見つかった解決策やマニュアルをいくつか読んだ後、次のことを試しました:

tar -cjf site1.bz2 -C . /var/www/site1/
tar -cjf site1.bz2 -C / /var/www/site1/
tar -cjf site1.bz2 -C /var/www/site1/ /var/www/site1/
tar -cjf site1.bz2 --strip-components=3 /var/www/site1/

しかし、どれも私の望み通りには動作しませんでした。何もしないものもあれば、サブディレクトリをアーカイブしないものもありました。

これは Cron によって起動されるバックアップ シェル スクリプト内にあるため、どのユーザーがそれを実行しているのか、パスと現在のディレクトリが何なのかがよくわかりません。そのため、常にすべてに絶対パスを記述する必要があります。また、スクリプト内でさらに何かが壊れるのを避けるために、現在のディレクトリを変更しないことをお勧めします (Web サイトだけでなくデータベースもバックアップし、それをすべて FTP などに送信するため)。

これを実現するにはどうすればよいでしょうか?

オプション -C の動作を誤解しているのでしょうか?

ベストアンサー1

tar -cjf site1.tar.bz2 -C /var/www/site1 .

上記の例では、/var/www/site1オプション-C /var/www/site1が指定されているため、tar は処理を実行する前にディレクトリを変更します。

からman tar

OTHER OPTIONS

  -C, --directory DIR
       change to directory DIR

おすすめ記事