tar を作成するときに空のディレクトリを除外することは可能ですか?

tar を作成するときに空のディレクトリを除外することは可能ですか?

次のようなバックアップ コマンドがあります。

tar cvpzf /backup/incremental-$now.tar.gz --after-date='1 day ago' -C / etc/ home/ root/  --exclude-from=/root/exclusion_list.txt --warning=no-file-unchanged > /backup/log-$now.txt 2>&1

問題は、空のフォルダーも含まれることです。そのフォルダー内のすべてのファイルは変更されていないため、増分バックアップには含まれません。これを回避する方法を探していますが、私が見つけた唯一の解決策 (find の結果を xargs の引数として tar にパイプする) は、フォルダーが 1 つの場合にのみ機能しますが、私の場合は 3 つのフォルダーがあります。

答え1

デフォルトでは、tar は空のディレクトリをスキップする手段を提供していません。そうは言っても、必要な作業を実行するために、単純なシェル スクリプトをどこからともなく引き出すのはそれほど大変な作業ではありません。

ここ必要が生じたときに、まったく同じ問題に対する解決策を見つけたフォーラムディスカッションです。

大幅な更新: まず、私のずさんなコピー&ペーストについて心からお詫び申し上げます。深夜の投稿だったので、私の知力はピークではありませんでした...

正しいフォーラム投稿はここ実際には、同じ人が別のフォーラムで同じ質問をして、まったく異なる回答を得ています。私は問題に遭遇したときに両方をブックマークしていたため、間違ったリンクを提供してしまいました。

実際のところ、ここで示されているのは、find コマンドの出力を tar に「パイプ」する方法です。質問者が尋ねている「より新しい」という部分はすべて無視する必要があります。

代わりに必要な検索部分は次のようになります。

find . -type d ! -empty | ...

もちろん、ドット (「.」) を find/tar を開始するパスに置き換える必要があります。パイプの後は、2 番目のリンク (正しいリンク) に従って tar コマンドを続行します。

細部への配慮が足りなかったためにご迷惑をおかけしましたら、改めて深くお詫び申し上げます。

答え2

少数のファイルのみを変更した場合にのみ機能する別の方法は次のとおりです。

tar cvzf [...] `find . -mtime -1 -type f`

変更が大量にある場合は、変更されたファイルのリストをファイルにダンプし、tar コマンドで --files-from パラメータを使用できます。

find . -mtime -1 -type f > /tmp/changed.txt
tar cvzf [...] --files-from=/tmp/changed.txt

または1行で

find . -mtime -1 -type f | tar cvzf [...] --files-from=/dev/stdin

関連情報