web-dev-qa-db-ja.com

ディレクトリをターゲットにしますが、絶対パスはアーカイブに保存しないでください

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

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がどのように機能するのか誤解しただけですか?

204
QuentinC
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
291
Lars Brinkhoff

オプション-Cは機能します。わかりやすくするために、2つの例を挙げます。

  1. フルパスなしでtarballを作成する:フルパス/home/testuser/workspace/project/application.warそして欲しいのはproject/application.warだけです。

    tar -cvf output_filename.tar  -C /home/testuser/workspace project
    

    注:workspaceprojectの間にはスペースがあります。 tarはフルパスをprojectに置き換えます。

  2. ターゲットパスを変更して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
30
Grizli

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ファイルに配置されます。

5
WLatif

"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/
/
0
Sergey Asachev

サブディレクトリをアーカイブしてサブディレクトリのパスをトリミングしたい場合は、このコマンドが役立ちます。

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