tar:中間ディレクトリを除いてリーフディレクトリを含める方法は?

tar:中間ディレクトリを除いてリーフディレクトリを含める方法は?

.tarファイルに抽出するのに適したtarファイルを作成したいと思います/。ファイルシステムのルートを表し、以下のtarに含めるすべてのエントリ(たとえば)、その他のディレクトリとetc/rc.d/init.d/glassfish3ファイルopt/glassfish3/...を含む作業ディレクトリを作成しましたopt/...

これにより、tarファイルにtar zcvpf files.tgz *中間ディレクトリ(たとえばetc、および)が含まれますetc/rc.doptその後、別のシステムに抽出すると/正常に動作しないため、そのディレクトリの所有権と権限が破損します。私は本当にそれらを放っておき、触れたくなかった。

だから私はこの問題に対する良い解決策を見つけたと思います。

find . -type f -print0 | tar zcvpf files.tgz --null --files-from -

ファイルのみを含むtarを生成します。これは素晴らしいです。私が入れたファイルだけがインポートされます...しかし、次の重要なリーフディレクトリはインポートされません。

opt/glassfish3/glassfish/lib/asadmin

これは空のディレクトリです(Glassfish3ではこれを要求し、そうでなければ文句を言います)。

中間ディレクトリはスキップし、最終ディレクトリはスキップしないtarファイルを作成する方法は?find+awk 魔法が役に立つような気がします。しかし、1行ずつ書き込む必要はなく、読みやすさが重要です。ありがとうございます。


編集する:私はこれを見つけました。その他/より良いアイデア歓迎:

cat <(find . -type f -print0) <(find . -type d -empty -print0) | tar zcvpf files.tgz --null --files-from -

ベストアンサー1

find「OR」が可能なので、-o次のように2つのコマンドを組み合わせることができます。find

find . \( -type f -o -type d -empty \) -print0 | tar ...

または、すべてのファイルを1つのコマンドラインに配置できることを保証できる場合

find . \( -type f -o -type d -empty \) -exec tar cvfz files.tgz {} +

おすすめ記事