--strip-comComponents -Cはtarで何を意味しますか?

--strip-comComponents -Cはtarで何を意味しますか?

次のコードを理解していることを確認したいと思います。

tar xvzf FILE --exclude-from=exclude.me --strip-components 1 -C DESTINATION

に投稿しましたこの回答

からman tar

--strip-components=NUMBER
抽出時にファイル名からNUMBER個の前のコンポーネントを削除します。

-C--directory=DIR
ディレクトリDIRに切り替える

マニュアルの説明がわかりませんでした--strip-components

については、-C「削除されたコンポーネントを指定されたディレクトリに配置します」という意味で理解しています。

どういう意味ですか--strip-components -C

答え1

あなたの質問に含まれるマンページの部分はGNU tar's manからのものです。 GNUは好ましいソフトウェアプロジェクトです。情報マニュアルはマンページよりも優れています。実際、tarのマンページは2014年にGNU tarソースツリーにのみ追加されました。 これは参考用であり、例を含む完全なマニュアルではありません。info tarオンラインでも提供されている完全な情報パンフレットを読み込むことができます。ここ。これにはいくつかの--strip-components使用例が含まれており、関連するスニペットは次のとおりです。

--strip-components=number

抽出する前に、ファイル名から指定された数の前のコンポーネントを削除します。

たとえば、「archive.tar」アーカイブに「some/file/name」が含まれている場合は、次のようにします。

tar --extract --file archive.tar --strip-components=2

このファイルは「name」ファイルに抽出されます。

そして:

--strip-components=number

抽出する前に、ファイル名から指定された数の前のコンポーネントを削除します。

たとえば、「/usr」階層全体を「usr.tar」というtarアーカイブにアーカイブしたとします。他のファイルのうち、このアーカイブには現在の作業ディレクトリに抽出したい「usr/include/stdlib.h」が含まれています。これを行うには、次のように入力します。

$ tar -xf usr.tar --strip=2 usr/include/stdlib.h

"--strip=2" オプションは、tar にファイル名の 2 つの主要部分 ("usr/" および "include/") を削除するように指示します。


言い換えれば。

以下のtarの他の実装があります。FreeBSD tar マンページこのコマンドは異なる方法で解釈されます。

--strip-components count

指定された数の先行パス要素を削除します。少数の要素を含むパス名は自動的にスキップされます。パス名は、包含/除外パターンを確認した後、セキュリティを確認する前に編集されます。

つまり、Unix パスは で区切られた一連の要素として理解する必要があります/(1 つしかない場合を除く/)。

これは私自身の例です(他の例は、上記のリンクされた情報パンフレットにあります。)

新しいディレクトリ構造を作成しましょう。

mkdir -p a/b/c

パスは、およびのa/b/c3つの要素で構成されています。abc

このディレクトリに空のファイルを作成し、.tarアーカイブに入れます。

$ touch a/b/c/FILE
$ tar -cf archive.tar a/b/c/FILE

FILEパスの4番目の要素ですa/b/c/FILE

archive.tar の内容をリストします。

$ tar tf archive.tar
a/b/c/FILE

--strip-components.tarファイルを抽出するときに削除するパス要素の数を示すパラメータを使用して、archive.tarを抽出できますa/b/c/FILE。元のaディレクトリを削除します。

rm -r a

--strip-components=1aまだ再生されていないコンテンツのみを抽出します。

$ tar xf archive.tar --strip-components=1
$ ls -Al
total 16
-rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar
drwxr-xr-x 3 ja users  4096 Mar 26 15:43 b
$ tree b
b
└── c
    └── FILE

1 directory, 1 file

ご覧のとおり、--strip-components=22a/bつの要素がまだ再生成されていません。

$ rm -r b
$ tar xf archive.tar --strip-components=2
$ ls -Al
total 16
-rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar
drwxr-xr-x 2 ja users  4096 Mar 26 15:46 c
$ tree c
c
└── FILE

0 directories, 1 file

まだ再生成されていない--strip-components=33つの要素があり、実行中の同じレベルディレクトリにあります。a/b/cFILEtar

$ rm -r c
$ tar xf archive.tar --strip-components=3
$ ls -Al
total 12
-rw-r--r-- 1 ja users     0 Mar 26 15:39 FILE
-rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar

-Cこのオプションは、要求されたジョブを実行する前に、tarに指定されたディレクトリに変更、抽出、およびアーカイブするように指示します。存在するこのコメント 尋ねる:

tarをCDに要求する:なぜCDを使うのですか?聞きたいです。なぜそれはMVではないのですか?

mvなぜこれがより良いと思いますか?まず、tarアーカイブをどのディレクトリに抽出しますか?

  • /tmp - 欠落しているかいっぱいになるとどうなりますか?

  • "$TMPDIR" - 設定されていない、欠落している、またはいっぱいになるとどうなりますか?

  • 現在のディレクトリ - ユーザーがw権限を持っていない場合、およびそれがある場合はrどうなりますかx

  • 一時ディレクトリ(それが何であれ)に、すでにアーカイブに存在するのと同じ名前のファイルが含まれており、tar抽出した場合、そのファイルを上書きするとどうなりますか?

  • 一時ディレクトリ(それが何であれ)がUnixファイルシステムをサポートしておらず、所有権、実行可能ビットなどに関するすべての情報が失われるとどうなりますか?

また、これは他のプログラムでも-C一般的に使用されるオプションです。change directoryそして 作る私の心に最初に浮かんだのは。

答え2

この--strip-componentsオプションは、抽出されたファイルのファイル名を変更するために使用されます。 --strip-components <N>「ファイル名の最初のコンポーネントを削除する」を意味します。<N>ここで「コンポーネント」は 。/

ファイル名がある場合は、抽出されたファイルにちなんで名前が付けられfoo/bar/bazます。--strip-components 1bar/baz


この-Cオプションは単に「ディレクトリの変更」を意味します。を使用している場合は、-C /some/other/place実際にファイルを抽出する前にプロンプ​​トが表示されますtarcd /some/other/placeこれは通常、ファイルが/some/other/place

答え3

良い答えに追加するにはラスケス-C、このオプションに関する混乱を解決するには、次の手順を実行します。

マニュアルtarページにはこのオプションが記載されています-C

-C, --directory=DIR
              Change  to DIR before performing any operations.  This option is
              order-sensitive, i.e. it affects all options that follow.

したがって、mv実際にはtar別の作業ディレクトリに変更することはありません。また、順序が重要であることに注意してください。だから:

tar r -f archive.tar -C /path file1 file2

ファイルと場所を追加しますfile1file2/patharchive.tar

tar r -f archive.tar file1 file2 -C /path file3 file4

現在の作業ディレクトリに追加され、そのfile1場所に追加されます。file2file3file4/path

--strip-components-C独立して無関係なオプションですtar。 1つ目は、解凍後にアーカイブのフォルダ構造に影響し、-Cアーカイブの外部にあるファイルを指定するための作業ディレクトリを指定します。tar

答え4

他の回答で説明されていない説明で何が言えるのかわかりません。代わりに例を挙げてお手伝いします。

Arkadiusz Drabczykが例を挙げました。~からGNU tar マニュアル アーカイブに大規模なディレクトリツリー(例:all  /usr)が含まれている場合:

$ tar -cf usr.tar  /usr

そして、アーカイブをドリルダウンして下位レベルのサブディレクトリからファイルを抽出しようとしています。

$ tar -xf usr.tar --strip=2 usr/include/stdlib.h

マニュアルに記載されていないものは次のとおりです。

$ tar -xf usr.tar           usr/include/stdlib.h

次に、現在のディレクトリの下にディレクトリを作成し、  tarその中にサブディレクトリを作成します。必要に応じて適切なコマンドを使用できます。ただし、現在のディレクトリにある場合は、次のものが必要です。usrincludeusrstdlib.h./usr/includestdlib.h

$ mv usr/include/stdlib.h .

それでは多分rmdir -p usr/include…これはうまくいきますが退屈です。  --strip=2タイピング時間を大幅に節約してください。


-Cc(小文字のC)オプション(Create Archive)と組み合わせて使用​​することもできます。これは理解しやすくなります。 John、Kate、Larry、Maryが共同で本を執筆しているとしましょう。彼らはそれぞれ1枚、2枚、3枚、4枚を書いています。 JohnとKateは(ただ)同じコンピュータを使用し、これまでに行った作業をアーカイブして他の著者に送信したいと考えています。次のいずれかを実行できます。

  CD適切なディレクトリへ)
$tar cf chap12.tar /home/john/chap1 /home/kate/chap2
または

$ cd /home
$ tar cf /tmp/chap12.tar john/chap1 kate/chap2

ただし、これらはコード化されたjohn/アーカイブを生成しますkate/。  これにより、LarryとMaryが使用または抽出するアーカイブに--strip=2なります  --strip=1  あなたを悩ませている人を保存したい場合(および/または個人情報保護などの理由であなたの名前をアーカイブから除外したい場合)は、次のことができます。

  CD適切なディレクトリへ)
$tar cf chap12.tar -C /home/john chap1 -C /home/kate chap2

これにより、アーカイブにはchap1ディレクトリchap2が表示されます。

関連情報