1. ホーム
  2. linux

[解決済み] ディレクトリをTarするが,完全な絶対パスはアーカイブに保存しない

2022-03-24 14:37:34

質問

バックアップのシェルスクリプトの一部に、以下のようなコマンドがあります。

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 アーカイブ内のディレクトリとファイル名から、抽出を簡素化し、無駄な一定のディレクトリ構造を避けるためです。万が一、バックアップしたウェブサイトを、ウェブデータが /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で起動するバックアップシェルスクリプトの中なので、どのユーザーが実行しているのか、パスとカレントディレクトリが何なのか、よくわかりません。したがって、常に絶対パスを書くことがすべてに必要で、さらにスクリプト内の何かを壊さないためにカレントディレクトリを変更しないことが望ましいです(ウェブサイトのバックアップだけでなくデータベースもあり、それらをすべてFTPに送信するなどするから)。

どうすれば実現できますか?

私が-Cオプションの働きを誤解しているだけでしょうか?

解決方法は?

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

上記の例では、tar はディレクトリ /var/www/site1 というオプションがあるため、作業を行う前に -C /var/www/site1 が指定されました。

から man tar :

OTHER OPTIONS

  -C, --directory DIR
       change to directory DIR