バックアップシェルスクリプトの一部に次のコマンドがあります。
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
。バックアップされたWebサイトを、Webデータがの下に保存されていない場所に抽出する場合。
上記の例では、次のようにしたいと思います。
tar -tf site1.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html
そのため、抽出すると、ファイルは現在のディレクトリに抽出され、後で抽出したファイルを移動する必要がないため、サブディレクトリ構造が保持されます。
tarとstackoverflow
Web上の他の場所でのバックアップについてはすでに多くの質問がありますが、それらのほとんどは、サブディレクトリ構造全体を削除する(フラット化)か、名前の最初の/を追加または削除するだけです(私はしません)抽出したときに正確に何が変わるかはわかりませんが)、それ以上はありません。
あちこちにある解決策のいくつかとマニュアルを読んだ後、私は試してみました:
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の動作を誤解しましたか?
-C
単に「ディレクトリの変更」を意味しますが、パスの置換(またはプレフィックス)はによってのみ実行できます--transform
。リフ。superuser.com/questions/595510/prepend-prefix-in-tar/595512 -C(ディレクトリの変更)と--transformを実行することができます: `` `tar cjf site1.bz2 --transform" s / ^ \。\ // $ targetbase / "-C / var / www / site1。`` `