バックアップシェルスクリプトの一部に次のコマンドがあります。
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
そのため、解凍するとファイルは現在のディレクトリに解凍され、後で解凍したファイルを移動する必要がなくなり、サブディレクトリ構造が維持されます。
stackoverflow
やWeb上の他の場所で、tarとバックアップに関する質問はすでにたくさんありますが、ほとんどの場合、サブディレクトリ構造全体を削除する(フラット化する)か、単に名前の先頭に/を追加または削除するだけです抽出時に何が変わるのか正確にはわからないが、それ以上はしない。
マニュアルと同様にあちこちで見つけられた解決策のいくつかを読んだ後に、私は試みました:
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がどのように機能するのか誤解しただけですか?
tar -cjf site1.tar.bz2 -C /var/www/site1 .
上記の例では、オプション/var/www/site1
が指定されているため、tarは実行する前にディレクトリ-C /var/www/site1
に変更します。
man tar
から:
OTHER OPTIONS
-C, --directory DIR
change to directory DIR
オプション-C
は機能します。わかりやすくするために、2つの例を挙げます。
フルパスなしでtarballを作成する:フルパス/home/testuser/workspace/project/application.war
そして欲しいのはproject/application.war
だけです。
tar -cvf output_filename.tar -C /home/testuser/workspace project
注:workspace
とproject
の間にはスペースがあります。 tarはフルパスをproject
に置き換えます。
ターゲットパスを変更してtarballを抽出する(デフォルトは.
、すなわち現在のディレクトリ)
tar -xvf output_filename.tar -C /home/deploy/
tar
は与えられたパスに基づいてtarballを抽出し、作成パスを保存します。この例では、ファイルapplication.war
は/home/deploy/project/application.war
に抽出されます。
/home/deploy
:抽出時に指定project
:tarballの作成時に与えられた
注意:作成したtarballをターゲットディレクトリに配置したい場合は、ターゲットパスをtarball名の前に追加するだけです。例えば。:
tar -cvf /path/to/place/output_filename.tar -C /home/testuser/workspace project
Tar v2.8.3までの-C
オプションは、すべてのプラットフォーム(OS)で一貫して動作するわけではありません。 -C
オプションはアーカイブにディレクトリを追加すると言われていますが、MacとUbuntuでは生成されたtar.gzファイルの中に絶対パスプレフィックスを追加します。
tar target_path/file.tar.gz -C source_path/source_dir
したがって、一貫性のある堅牢な解決策は、source_path(source_dirの親ディレクトリ)にcd
を入力して実行することです。
tar target_path/file.tar.gz source_dir
または
tar -cf target_path/file.tar.gz source_dir
あなたのスクリプトで。これにより、生成されたtar.gzファイルのディレクトリ構造内の絶対パスプレフィックスが削除されます。
次のコマンドはルートディレクトリ "。"を作成します。指定されたディレクトリからすべてのファイルをそのディレクトリに配置します。
tar -cjf site1.tar.bz2 -C /var/www/site1 .
すべてのファイルをtarファイルのルートに置きたい場合は、@ chinthakaが適切です。ディレクトリにcdして、次のようにします。
tar -cjf target_path/file.tar.gz *
これにより、cwd内のすべてのファイルがルートファイルとしてtarファイルに配置されます。
"point"を使用すると、 "point"という名前のフォルダが作成されます(Ubuntu 16上)。
tar -tf site1.bz2 -C /var/www/site1/ .
私はこれをより詳細に扱い、例を用意しました。マルチラインレコーディング、および例外.
tar -tf site1.bz2\
-C /var/www/site1/ style.css\
-C /var/www/site1/ index.html\
-C /var/www/site1/ page2.html\
-C /var/www/site1/ page3.html\
--exclude=images/*.Zip\
-C /var/www/site1/ images/
-C /var/www/site1/ subdir/
/
サブディレクトリをアーカイブしてサブディレクトリのパスをトリミングしたい場合は、このコマンドが役立ちます。
tar -cjf site1.bz2 -C /var/www/ site1