web-dev-qa-db-ja.com

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を使用

72
Micha

圧縮するディレクトリに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. どちらか:ファイルを別の場所に作成します-/tmpは考えられる場所の1つです-そして、完了後に元の場所に戻します。
  2. または:GNU Tarを使用している場合は、--exclude=workspace.tar.gzオプションを使用します。 =の後の文字列はパターンです-例は最も単純なパターンです-完全一致。推奨事項に反して現在のディレクトリで作業している場合は、--exclude=./workspace.tar.gzを指定する必要があります。提案されているように1レベル上に作業している場合は、--exclude=workspace/workspace.tar.gzを指定する必要があります。除外するtarファイルが複数ある場合は、*のように「--exclude=./*.gz」を使用します。
58

本当に tarballにトップディレクトリを含めたくない場合(そして、それは一般的に悪い考えです):

tar czf workspace.tar.gz -C /path/to/workspace .
42
rkhayrov

実行する手順はいくつかあります。

  1. *.に置き換えて、隠しファイルも含めます。
  2. 同じディレクトリにアーカイブを作成するには、--exclude=workspace.tar.gzを使用してアーカイブ自体を除外できます。
  3. アーカイブがまだ作成されていないときにtar: .: file changed as we read itエラーが発生しないように、(たとえばtouchを使用して)アーカイブが存在することを確認して、-excludeアーカイブファイル名と一致します。 (ファイルが存在しないと一致しません)

この結果を組み合わせて、次のスクリプトを作成します。

touch workspace.tar.gz
tar -czf workspace.tar.gz --exclude=workspace.tar.gz .
29
Veger

圧縮したいディレクトリ(現在のディレクトリ)でこれを試してください:

tar -czf workspace.tar.gz . --exclude=./*.gz
17
empugandring

ディレクトリに戻って次の操作を行うことで、隠しディレクトリを含めることができます。

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

Gzipするディレクトリをワークスペースと呼びます。

7
bramp

.を使用すると、--excludeフォームを修正できます。

tar -czf workspace.tar.gz --exclude=workspace.tar.gz .
6
caf

更新: OPのコメントの修正を追加しました。

tar -czf workspace.tar.gz .

実際に現在のディレクトリを変更しますが、他の場所にファイルを配置しないのはなぜですか?

tar -czf somewhereelse/workspace.tar.gz .
mv somewhereelse/workspace.tar.gz . # Update
4
Peter Jaric

実際には、問題は圧縮オプションにあります。トリックは、組み込みオプションを使用する代わりにtar結果をコンプレッサーにパイプすることです。ちなみに、追加の圧縮オプションを設定できるため、圧縮率が向上します。

最小タール:

tar --exclude=*.tar* -cf workspace.tar .

選択したコンプレッサーにパイプします。この例は冗長であり、最大圧縮でxzを使用します。

tar --exclude=*.tar* -cv . | xz -9v >workspace.tar.xz

ソリューションは、Ubuntu 14.04とWindows 7のCygwinでテストされました。これはコミュニティWikiの回答なので、間違いを見つけた場合は自由に編集してください。

4
s3v1

いい質問です。 ZSHでは、グロブ修飾子(D)を使用できます。これは「ドットファイル」の略です。比較:

ls $HOME/*

そして

ls $HOME/*(D)

これにより、特別なディレクトリエントリ.および..が正しく除外されます。 Bashでは、.*を使用して、ドットファイルを明示的に含めることができます。

ls $HOME/* $HOME/.*

ただし、それには...も含まれるため、探していたものではありません。 *をbashのドットファイルに一致させる方法もあると確信しています。

1
loevborg

さらに別の解決策は、フォルダー内のアイテムの数がそれほど多くないと仮定した場合です。

tar -czf workspace.tar.gz `ls -A`

ls -Aは通常のファイルと隠しファイルを印刷しますが、ls -aのように「。」と「..」は印刷しません。)

1
Joachim Wagner

ここで提供されるほとんどのソリューションの問題は、すべてのエントリの開始時に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しようとしているディレクトリに多数のエントリ(ディレクトリとファイル)を持つパッケージを作成しようとすると、このソリューションは機能しません。

1
Ellis
tar -czf workspace.tar.gz .??* *

.??*を指定すると、ドットの後に少なくとも2文字ある「ドット」ファイルとディレクトリが含まれます。欠点は、.aなどのドットの後に単一の文字があるファイル/ディレクトリが含まれないことです。

0
Scott Thomson

私自身も同様の状況でした。他の場所でtarを作成し、-Cを使用してtarに圧縮ファイルのベースディレクトリを指定するのが最善だと思います。例:

tar -cjf workspace.tar.gz -C <path_to_workspace> $(ls -A <path_to_workspace>)

この方法では、独自のtarfileを除外する必要はありません。他のコメントで述べたように、-Aは隠しファイルをリストします。

0
ginin

ディスクスペースが問題にならない場合、これは非常に簡単なことです。

mkdir backup
cp -r ./* backup
tar -zcvf backup.tar.gz ./backup
0
bicycle