385

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

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

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

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

4

8 に答える 8

512
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
于 2013-09-08T07:49:53.793 に答える
54

オプション-Cは機能します。明確にするために、2つの例を投稿します。

  1. フル パスなしで tarball を作成する: フル パス/home/testuser/workspace/project/application.warと必要なのは次のproject/application.warとおりです。

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

    注: と の間にはスペースがworkspaceありprojectます。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
于 2014-12-03T15:01:22.857 に答える