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


89

ディレクトリを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を使用)


5
たぶん、この質問はスーパーユーザーのものですか?
Peter Jaric 2010

回答:


75

パックするディレクトリに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推奨事項に反して、現在のディレクトリで作業しているかどうかを指定する必要がある場合があります。--exclude=workspace/workspace.tar.gz提案されているように、1つのレベルで作業しているかどうかを指定する必要がある場合があります。除外するtarファイルが複数ある場合は、のように ' *'を使用し--exclude=./*.gzます。

1
良い答えですが、パックする必要のあるディレクトリ内でこのコマンドを実行せざるを得ない状況があります。外で実行するための権限が不十分です。
Hexodus 2014年

パックするのに最適な場所は確かに/ tmpです。
アンドレフェロー

45

あなたがいる場合、実際にtarballにトップディレクトリを含める必要はありません(それは一般的に悪い考えです):

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

トップディレクトリを除外する必要があり、tarをベースディレクトリに配置する必要があります。
ミカ2010

@Michaは、ファイルをアーカイブおよびコピーするためのbashスクリプトを作成します
Fedir RYKHTIK 2013年

2
-czfで-が欠けていると思います。
upTheCreek 2014年

10
man tar:tarの最初の引数は関数である必要があります。文字の1つAcdrtux、または長い関数名の1つ。 関数文字の前に。を付ける必要はなく-、他の1文字のオプションと組み合わせることができます。
rkhayrov 2014年

4
それでも動作しません、私はまだ「。」を持っています。私のtarballのトップディレクトリとして
A. Gille 2017

43

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

  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 .

7
私はすべての回答とコメントを読みました。これは、同じディレクトリにtarballを作成するための最も良い方法です。この回答から、このエラーが発生する理由もわかりました。
のSzymonSadło

tarファイルの圧縮中に進行状況を確認したい場合は--verbose、次のようにの フラグを追加できます-czvf
Mastrianni

18

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

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

2
しかし、今ではファイル「。」に文句を言います。読みながら変更されました。すべてのファイルが含まれていることを確認できますか?
Jaan 2015年

1
これ.gzにより、ディレクトリ内のすべてのファイルが除外されます。
omerfarukdogan

12

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

cd ..
tar czf workspace.tar.gz workspace

gzipしたいディレクトリがworkspaceと呼ばれていると仮定します。


また、これによりファイルの変更の問題も回避されます。
ジョナサンレフラー2010

ユーザーが親フォルダーに書き込み権限を持っていない場合は機能しません。
Joachim Wagner

まさに@JoachimWagner!
p01ymath

1
@JoachimWagner。書き込み権限がない場合は、次のように変更しますtar -czf /path/to/where/you/do/have/permission/workspace.tar.gz workspace
。–

1
私はそれを機能させるために-前に取り出さなければなりませんでしたczf。そうしないと、Cannot stat: No such file or directoryエラーメッセージが表示されていました。
PhemeloKhetho19年

6

.を使用してフォームを修正できます--exclude

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

5

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

tar -czf workspace.tar.gz .

実際に現在のディレクトリを変更しますが、ファイルを別の場所に配置してみませんか?

tar -czf somewhereelse/workspace.tar.gz .
mv somewhereelse/workspace.tar.gz . # Update

ファイルは後で処理され、ワー​​クスペースにある必要があります-少し醜いですが、必要なだけです(すべては単なる回避策ではありません...)
Micha 2010

OK、その修正を追加します:)
Peter Jaric 2010

また、これを繰り返し実行できるようにする必要がある場合は、tar行の前に「rmworkspace.tar.gz」を追加します。
Peter Jaric

ドライブ全体をtarする場合は、 は、同じドライブ、あなたが多くのオプションを持っていないようです。
BeeOnRope 2017

4

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

最小限のtar:

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

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

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

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


ありがとうございました!救われたmaの命
スティーブン

2

ここで提供されるほとんどのソリューションの問題は、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

良い質問です。(D)ZSHでは、「ドットファイル」を表すglobbing修飾子を使用できます。比較:

ls $HOME/*

そして

ls $HOME/*(D)

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

ls $HOME/* $HOME/.*

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


bashでは、を使用.??*して、.とではなくすべてのドットファイルを照合します..。それは(のような.a)単一文字のドットファイルを取得しません。それらも取得するには、より複雑なを使用します.[^.]*
スコットミンスター2013年

1

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

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

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


0
tar -czf workspace.tar.gz .??* *

指定.??*には、ドットの後に2文字以上ある「ドット」ファイルとディレクトリが含まれます。欠点は、ドットの後に1文字のファイル/ディレクトリが含まれないこと.aです(存在する場合など)。


0

ディスク容量が問題にならない場合、これは非常に簡単なことでもあります。

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

0

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

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

このように、独自のtarfileを除外する必要はありません。他のコメントに記載されているように、-Aは隠しファイルを一覧表示します。


0

10年後、tarGit 2.30(Q1 2021)で示されている、の代替手段があります。これは、 " git archive" manを使用してtarの代わりにリリースtarballを生成し ます。
(その代替手段を適用するためにGit 2.30は必要ありません)

参照してください。4813277コミット(2020年10月11日)を、そして93e7031コミット(2020年10月10日)をすることによりルネScharfe( )rscharfe
(合併によりJunio C浜野- gitster-63e5273コミットし、2020年10月27日)を

Makefile:dist-docにはgit init / add / commit / archiveを使用します

サインオフ:RenéScharfe

tarの代わりにmanコマンドを使用してHTMLドキュメントとマンページの配布アーカイブを生成することにより、外部ツールへの依存を減らします。これにより、アーカイブエントリにバイナリのdistアーカイブのメタデータと同じメタデータが提供されます。git

したがって、代わりに:

tar cf ../archive.tar .

Gitを使用してのみ実行できます。

git -C workspace init
git -C workspace add .
git -C workspace commit -m workspace
git -C workspace archive --format=tar --prefix=./ HEAD^{tree} > workspace.tar
rm -Rf workspace/.git

ここ説明したように、一部のエキゾチックなプラットフォームにはオプションがない古いtarディストリビューションがある可能性があるため、これは最初に提案されました。


-1

使用するのfindがおそらく最も簡単な方法です。

find . -maxdepth 1 -exec tar zcvf workspace.tar.gz {} \+

find . -maxdepth 1現在のディレクトリ内のすべてのファイル/ディレクトリ/シンボリックリンクなどを検索し、で指定されたコマンドを実行します-exec{}指令手段の中にファイルリストがここに入ります\+、コマンドがとして実行されることを意味します:

tar zcvf workspace.tar.gz .file1 .file2 .dir3

の代わりに

tar zcvf workspace.tar.gz .file1
tar zcvf workspace.tar.gz .file2
tar zcvf workspace.tar.gz .dir3

-Jはマニュアルでは--xzです。-cと組み合わせると、コンピューターが「楽しい」と呼ぶものの始まりにすぎません:)
Ricalsin 2013

ははは、自宅のミニサーバーはCPUよりもディスク容量によって制限されています:)良い点です。gzipを使用するように変更します。
Andrew Gunnerson 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.