私はディレクトリを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を使用
圧縮するディレクトリに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つの方法のいずれかで処理できます。
/tmp
は考えられる場所の1つです-そして、完了後に元の場所に戻します。--exclude=workspace.tar.gz
オプションを使用します。 =
の後の文字列はパターンです-例は最も単純なパターンです-完全一致。推奨事項に反して現在のディレクトリで作業している場合は、--exclude=./workspace.tar.gz
を指定する必要があります。提案されているように1レベル上に作業している場合は、--exclude=workspace/workspace.tar.gz
を指定する必要があります。除外するtarファイルが複数ある場合は、*
のように「--exclude=./*.gz
」を使用します。本当に tarballにトップディレクトリを含めたくない場合(そして、それは一般的に悪い考えです):
tar czf workspace.tar.gz -C /path/to/workspace .
実行する手順はいくつかあります。
*
を.
に置き換えて、隠しファイルも含めます。--exclude=workspace.tar.gz
を使用してアーカイブ自体を除外できます。tar: .: file changed as we read it
エラーが発生しないように、(たとえばtouch
を使用して)アーカイブが存在することを確認して、-excludeアーカイブファイル名と一致します。 (ファイルが存在しないと一致しません)この結果を組み合わせて、次のスクリプトを作成します。
touch workspace.tar.gz
tar -czf workspace.tar.gz --exclude=workspace.tar.gz .
圧縮したいディレクトリ(現在のディレクトリ)でこれを試してください:
tar -czf workspace.tar.gz . --exclude=./*.gz
ディレクトリに戻って次の操作を行うことで、隠しディレクトリを含めることができます。
cd ..
tar -czf workspace.tar.gz workspace
Gzipするディレクトリをワークスペースと呼びます。
.
を使用すると、--exclude
フォームを修正できます。
tar -czf workspace.tar.gz --exclude=workspace.tar.gz .
更新: OPのコメントの修正を追加しました。
tar -czf workspace.tar.gz .
実際に現在のディレクトリを変更しますが、他の場所にファイルを配置しないのはなぜですか?
tar -czf somewhereelse/workspace.tar.gz .
mv somewhereelse/workspace.tar.gz . # Update
実際には、問題は圧縮オプションにあります。トリックは、組み込みオプションを使用する代わりにtar結果をコンプレッサーにパイプすることです。ちなみに、追加の圧縮オプションを設定できるため、圧縮率が向上します。
最小タール:
tar --exclude=*.tar* -cf workspace.tar .
選択したコンプレッサーにパイプします。この例は冗長であり、最大圧縮でxzを使用します。
tar --exclude=*.tar* -cv . | xz -9v >workspace.tar.xz
ソリューションは、Ubuntu 14.04とWindows 7のCygwinでテストされました。これはコミュニティWikiの回答なので、間違いを見つけた場合は自由に編集してください。
いい質問です。 ZSHでは、グロブ修飾子(D)
を使用できます。これは「ドットファイル」の略です。比較:
ls $HOME/*
そして
ls $HOME/*(D)
これにより、特別なディレクトリエントリ.
および..
が正しく除外されます。 Bashでは、.*
を使用して、ドットファイルを明示的に含めることができます。
ls $HOME/* $HOME/.*
ただし、それには.
と..
も含まれるため、探していたものではありません。 *
をbashのドットファイルに一致させる方法もあると確信しています。
さらに別の解決策は、フォルダー内のアイテムの数がそれほど多くないと仮定した場合です。
tar -czf workspace.tar.gz `ls -A`
(ls -A
は通常のファイルと隠しファイルを印刷しますが、ls -a
のように「。」と「..」は印刷しません。)
ここで提供されるほとんどのソリューションの問題は、すべてのエントリの開始時にtarに./
が含まれていることです。そのため、GUIコンプレッサーで開くときに.
ディレクトリが作成されます。だから私がやったことは:
ls -1A | xargs -d "\n" tar cfz my.tar.gz
現在のディレクトリにmy.tar.gz
が既にある場合は、これをgrepしてください。
ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz
注意してください xargsには一定の制限があります(xargs --show-limits
を参照)。したがって、tarしようとしているディレクトリに多数のエントリ(ディレクトリとファイル)を持つパッケージを作成しようとすると、このソリューションは機能しません。
tar -czf workspace.tar.gz .??* *
.??*
を指定すると、ドットの後に少なくとも2文字ある「ドット」ファイルとディレクトリが含まれます。欠点は、.a
などのドットの後に単一の文字があるファイル/ディレクトリが含まれないことです。
私自身も同様の状況でした。他の場所でtarを作成し、-Cを使用してtarに圧縮ファイルのベースディレクトリを指定するのが最善だと思います。例:
tar -cjf workspace.tar.gz -C <path_to_workspace> $(ls -A <path_to_workspace>)
この方法では、独自のtarfileを除外する必要はありません。他のコメントで述べたように、-Aは隠しファイルをリストします。
ディスクスペースが問題にならない場合、これは非常に簡単なことです。
mkdir backup
cp -r ./* backup
tar -zcvf backup.tar.gz ./backup