tar: .svn などを含む現在のディレクトリ内のすべてのファイルとディレクトリを追加します。質問する

tar: .svn などを含む現在のディレクトリ内のすべてのファイルとディレクトリを追加します。質問する

ディレクトリをtar.gzして使用してみる

tar -czf workspace.tar.gz *

結果のtarには.svnサブディレクトリ内のディレクトリが含まれますが、現在のディレクトリ内のディレクトリは含まれません(*tarに渡される前に「可視」ファイルのみに展開されるため)。

やってみました

tar -czf workspace.tar.gz .代わりに、読み取り中に「.」が変更されたため、エラーが発生します。

tar: ./workspace.tar.gz: file changed as we read it

*ディレクトリ内のすべてのファイル (ドットプレフィックスを含む) に一致するトリックはありますか?

(Linux SLES-11 (2.6.27.19) で bash を使用)

ベストアンサー1

パックするディレクトリに tar ファイルを作成しないでください。

tar -czf /tmp/workspace.tar.gz .

うまくいきますが、解凍時に現在のディレクトリ全体のファイルが抽出されます。次のようにする方がよいでしょう。

cd ..
tar -czf workspace.tar.gz workspace

または、現在いるディレクトリの名前がわからない場合は、次のようにします。

base=$(basename $PWD)
cd ..
tar -czf $base.tar.gz $base

(これは、現在の場所に到達するためにシンボリックリンクをたどっていないこと、およびシェルがシンボリックリンクを逆方向にジャンプして推測しようとしないことを前提としていますが、bashこの点では信頼できません。そのことを心配する必要がある場合は、cd -P ..物理的なディレクトリ変更を行うために を使用してください。私の見解では、これがデフォルトの動作ではないのは愚かです。少なくとも、cd ..他に意味がなかった人にとっては混乱を招きます。)


ディスカッション中のコメントの 1 つに、次のようなコメントがあります。

私は [...] トップ ディレクトリを除外する必要があり、 [...] tar をベース ディレクトリに配置する必要があります。

コメントの最初の部分はあまり意味がありません。tar ファイルに現在のディレクトリが含まれている場合、定義上、現在のディレクトリはすでに存在しているため (非常に特殊な状況を除く)、そのアーカイブからファイルを抽出しても現在のディレクトリは作成されません。

コメントの 2 番目の部分は、次の 2 つの方法のいずれかで処理できます。

  1. いずれかの方法: ファイルを別の場所に作成し ( /tmp1 つの場所として考えられます)、完了したら元の場所に戻します。
  2. または、GNU Tar を使用している場合は、--exclude=workspace.tar.gzオプションを使用します。 の後の文字列は=パターンです。この例は最も単純なパターンで、完全一致です。--exclude=./workspace.tar.gz推奨に反して現在のディレクトリで作業している場合は、を指定する必要があるかもしれません--exclude=workspace/workspace.tar.gz。また、提案されているように 1 レベル上で作業している場合は、 を指定する必要があるかもしれません。除外する tar ファイルが複数ある場合は、*のように ' 'を使用します--exclude=./*.gz

おすすめ記事