tar は特定のディレクトリを除外しますが、サブディレクトリは除外しません。

tar は特定のディレクトリを除外しますが、サブディレクトリは除外しません。

多くのネットワークディレクトリを別のコンピュータに転送する必要があります。ディレクトリ構造は次のとおりです。

/var/www/
    site1/
        cgi-bin/ ...
        logs/ ...
        index.html
        images/ ...
        ...
    site2/
        cgi-bin/
        logs/
        ...
    size3/
    ...

使用したいファイルをパッケージ化するにはtar。すべての「cgi-bin」および「logs」ディレクトリを除くすべてのファイルをパッケージ化する必要があります。ただサブディレクトリではなく、いくつかの提供されたパスにあります!

これらのディレクトリはターゲットに存在してはいけませんし、サイズが非常に大きくなる可能性があるため、パッケージングから除外する必要があります。これにより伝送速度が遅くなる。だから私は欲しくない含めてターゲットのみを削除したいです。

私はいくつかの組み合わせを試しました。

cd /var/www
tar cfz ~/web.tgz site* --exclude-from excludes.list

Excepts.list は、次の行を含むファイルです。 (例はさまざまなパススタイルを示しています。ファイル全体で各パススタイルを一貫して使用しましたが、バリエーションは機能しませんでした。)

site1/cgi-bin
site1/logs
./site2/cgi-bin
/var/www/site2/logs

"cgi-bin"ディレクトリは別のサブディレクトリに表示される可能性があります(コマンドを使用して一覧表示されますfind)、除外したい「logs」ディレクトリは各「サイト」に直接あります。X」ディレクトリ。その他の「ログ」ディレクトリ必ず含めなければならない

2つの結果しか得られません。

  1. ファイルはまったく除外されません
  2. すべてのディレクトリ部分的に/var/www/site2/bla/site1/logs/ など、一致する除外パターンは除外されます。これは受け入れられないことなのであまり除外する

tar提供された除外パターンのように見える他の部分なしで提供された絶対パスを完全に除外する方法はありますか?

答え1

プロセス置換を使用してfind除外するディレクトリのリストを作成できます。あなたの実装が次のオプションをサポートしているとします
find-maxdepth

cd /var/www
tar cfz ~/web.tgz --exclude-from=<(
  find site* -maxdepth 1 -type d -name 'logs'
  find site* -type d -name 'cgi-bin'
) site* 

テスト設定:

site1/
├── cgi-bin
│   └── file1
├── images
│   ├── cgi-bin
│   │   └── file2
│   └── logs
│       └── file3
├── index.html
└── logs
    └── file4

出力:

$ tar cvfz ~/web.tgz --exclude-from=<(
  find site* -maxdepth 1 -type d -name 'logs'
  find site* -type d -name 'cgi-bin'
) site*
site1/
site1/images/
site1/images/logs/
site1/images/logs/file3
site1/index.html

除外されたディレクトリ(2つのコマンドの出力find):

site1/logs
site1/cgi-bin
site1/images/cgi-bin

関連情報