隠しファイルを除いて、ディレクトリのtarアーカイブを作成しますか?


17

特定のディレクトリのtarアーカイブを作成したい(もちろんそのサブディレクトリも)。しかし、tarコマンドを使用して実行すると、含まれているファイルのリストが表示されます。たとえば、

calendar_final /._ style.css

calendar_final / style.css

ご覧のとおり、同じファイルには2つのバージョンがあります。これはすべてのファイルに当てはまり、多くのファイルがあります。tarアーカイブから._プレフィックスが付いた一時ファイルを除外するにはどうすればよいですか?


このかもしれないのヘルプ:unix.stackexchange.com/questions/2213/...
tshepang

これらは一時ファイルではありませんが、OS Xファイルシステムのメタデータを表します(間違えなければ、Finderラベル、タイプとクリエーターコード、拡張属性などが含まれます)。これらのファイルは、OS Xでtarを作成する前には存在しません。可能な答えは、OS X / HFS +または別のシステムのどちらにいるかによって異なります。
ダニエルベック

回答:


33

Mac OS Xシステムで作業しているというコメントを投稿しました。これは、これらの._*ファイルの目的に対する重要な手がかりです。

これらの._*アーカイブエントリは、対応するファイル(プレフィックスのないファイル)に関連付けられた追加情報を含むAppleDoubleデータのチャンクです._。これらは、Mac OS X固有のcopyfile(3)関数ファミリによって生成されます。AppleDouble Blobは、アクセス制御データ(ACL)と拡張属性(通常、Finderフラグと「リソースフォーク」を格納しますが、xattrsはあらゆる種類のデータを格納するために使用できます)を格納します。

システムが提供するMac OS Xアーカイブツール(bsdtar(としてもシンボリックリンクtar)、、gnutarおよびpax._*は、拡張情報が関連付けられているファイルのアーカイブメンバーを生成します。「アーカイブ解除」モードでは、それらのアーカイブメンバーもデコードし、結果の拡張情報を関連ファイルに適用します。これにより、HFS +ファイルシステムが保存できるすべての情報を保存し、後で抽出することにより、Mac OS Xシステムで使用するための「完全忠実」アーカイブが作成されます。

他のシステムの対応するアーカイブツールは、これらの._*ファイルに特別な処理を行うことを知らないため、通常のファイルとして解凍されます。このようなファイルは他のシステムではほとんど役に立たないため、多くの場合「ジャンクファイル」と見なされます。同様に、Mac OS X以外のシステムがで始まる通常のファイルを含むアーカイブを生成する._場合、Mac OS Xのアーカイブ解除ツールはそれらのファイルを拡張情報としてデコードしようとします。

ただし、システムが提供するMac OS Xアーカイバを他のUnixyシステムと同じように動作させる文書化されていない(?)方法があります:COPYFILE_DISABLE環境変数。この変数を(空の文字列でも任意の値に)設定すると、アーカイバ._*はアーカイブファイルに関連付けられた拡張情報を表すアーカイブメンバーを生成できなくなります。また、アーカイバがそのようなアーカイブメンバーを拡張情報として解釈しようとするのを防ぎます。

COPYFILE_DISABLE=1 tar czf new.tar.gz …
COPYFILE_DISABLE=1 tar xzf unixy.tar.gz …

頻繁にこの方法で作業したい場合は、シェルの初期化ファイルでこの変数を設定できます。

# disable special creation/extraction of ._* files by tar, etc. on Mac OS X
COPYFILE_DISABLE=1; export COPYFILE_DISABLE

次に、(拡張情報を保存/復元するために)機能を再度有効にする必要がある場合、個々のコマンドの変数を「設定解除」できます。

(unset COPYFILE_DISABLE; tar czf new-osx.tar.gz …)

Mac OS X 10.4のアーカイバも同様のことを行いますが、異なる環境変数を使用します:COPY_EXTENDED_ATTRIBUTES_DISABLE


これが機能しないのを見た人はいますか?Yosemiteでこのソリューションを試しましたが、AIXボックスで解凍すると、PaxHeaderディレクトリがまだ生成されます
-conorgriffin

5

これは動作するはずです:

tar zcf calendar.tgz "a calendar_final" --exclude '.*'

私はそれがうまくいくと思ったが、実際にアーカイブを展開すると、それらが含まれていたことがわかった:/

奇妙な、どのバージョンのtarを使用していますか?tar --versionここでGNU 1.23を提供します。
フレデリックデューエルト

1
これらのファイルはOS Xのファイルシステムメタデータであり、tarを実行する前には存在しないため、この方法で除外できない可能性があります。別のMacでアーカイブされたパッケージを展開するときにOS Xファイルのメタデータを復元できるようにするために含まれています。
ダニエルベック

私のために働く。tar vzcf ...間違ったファイルが含まれているかどうかを確認するために使用することをお勧めします。
-stribika

@stribika彼はおそらくOS Xを使用しています。質問に関する私のコメントをご覧ください。これらのファイルはtarアーカイブの外部に存在しないため、除外できません。
ダニエルベック

2

Frederik Deweerdtは、GNU tar(Linux、Cygwin、FreeBSD、OSX、おそらく他で使用される)で動作するソリューションを提供しましたが、NetBSD、OpenBSD、Solarisなどの他のシステムでは動作しません。

POSIXはtarコマンドを指定せず(UNIXの亜種間で大幅に異なるため)、pax代わりにコマンドを導入します。このオプション-wはアーカイブを作成することを意味し(-r抽出)、-xアーカイブ形式を選択します。このオプション-s '!BRE!!'は、パスが基本的な正規表現BREと一致するすべてのファイルを除外します。

pax -w -x ustar -s '!^.*/\..*$!!' calendar_final >calendar_final.tar

興味深い...私はpaxについて知りませんでした。
ガベ。

2

以下のようbsdtar 3.0.3 - libarchive 3.0.3(そしておそらくそれ以前)に、新たなキー(Mac OS Xの特定の)オプションがありますbsdtarと呼ばれるコマンド--disable-copyfileの作成抑制する._ファイルが。の古いバージョンにtar--disable-copyfileオプションがありませんが、環境変数の設定は機能するCOPYFILE_DISABLE=1はずです。


それにもかかわらず、文書化が、利用可能なされていません。bsdtar 2.8.3 - libarchive 2.8.310.7.5--disable-copyfile
ステファンシュミット

0

次の手順を実行します:

  1. すべての._ファイルを見つけて一覧表示し、すべてのファイルを表示して最終的に削除-lsできるようにします._

    find /path/to/directory -type f -iname "._*.*" -ls -delete
    
  2. を使用してアーカイブ.tarを作成します。

    tar -cvf name.tar /path/to/directory
    
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.