隠しファイルとフォルダを含むアーカイブを作成すると、.rootエントリが作成されます。

隠しファイルとフォルダを含むアーカイブを作成すると、.rootエントリが作成されます。

隠しファイルと隠しフォルダーを含むプロジェクト フォルダーをアーカイブしようとしているのですが、ルート エントリが のフォルダーが見つかります.。これは困ったものです。通常、次のようになります。

tar -czf $ARCHIVE_NAME -C $DIR .

次のようなアーカイブを作成します

./package.json
./.git
./.gitignore
.
.
.

アーカイブのルートにはエントリではなく実際のファイルとフォルダを配置したい.

package.json
.git
.gitignore
.
.
.

それ、どうやったら出来るの?

* 編集 *

以下の画像は、この質問を明確にするのに役立つかもしれません。

  • 左側は、プロジェクトの GUI ツールで作成されたアーカイブ (2 日前)。
  • 右側は、上記のtarコマンドで作成されたアーカイブです。

「場所」バーに注目してください。右側のアーカイブは で/ない /./

ここに画像の説明を入力してください

答え1

./現在のディレクトリを意味します。 2 つのリストは同一です。

./アーカイブをリストするときにファイルの前にを付けると、特別な名前を持つファイルを処理するのに役立ちます。ファイル名は、2 番目のツールで処理できるよう-fileに表示されます。./-file

答え2

コマンドを変更する

tar -czf $ARCHIVE_NAME -C $DIR .

tar -czf $ARCHIVE_NAME -C $DIR ./*

これでうまくいくはずです。この方法では、「ディレクトリを.アーカイブに追加する」のではなく、「ディレクトリ内のすべてのファイルを.アーカイブに追加する」ことになります。

答え3

このコマンドは、先頭の : を除いて現在のディレクトリ内のファイルを tar します./

tar cf /some/tarfile.tar *

もちろん、ピリオドで始まるファイル名は含まれませんが、これはおそらく望ましくないでしょう。ワイルドカードを追加して、これらをキャッチすることができます。

tar cf /some/tarfile.tar * .[a-zA-Z]*

しかし、これは汎用的な解決策ではありません。適切なワイルドカードを作成できるように、ディレクトリ内のファイル名を知っておく必要があります。

ほとんどの Linux ディストリビューションで使用されている GNU tar には、式を使用してファイル名を変換する機能があります。これにより、アーカイブの作成時にファイルから がsed削除されます。./

tar cf /some/tarfile.tar --transform 's,^\./,,' .

結果のアーカイブには、 "." ディレクトリ自体のエントリがまだ含まれています。

のいくつかのバージョンでは、tartar されるファイルの名前をファイルから読み取ることができます。この機能を利用して次の操作を実行できます。

ls -a | egrep -v '^\.\.?$' | tar cf - -T /dev/stdin

このパイプラインは、現在のディレクトリ内のすべてのファイルのリストを作成し、.および..エントリを削除して、残りの名前を にパイプしますtar。tar は、(標準入力) から読み取ったファイル名からアーカイブを作成します/dev/stdin

関連情報