次のコードを理解していることを確認したいと思います。
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/c
3つの要素で構成されています。a
b
c
このディレクトリに空のファイルを作成し、.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=1
a
まだ再生されていないコンテンツのみを抽出します。
$ 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=2
2a/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=3
3つの要素があり、実行中の同じレベルディレクトリにあります。a/b/c
FILE
tar
$ 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 1
bar/baz
この-C
オプションは単に「ディレクトリの変更」を意味します。を使用している場合は、-C /some/other/place
実際にファイルを抽出する前にプロンプトが表示されますtar
。cd /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
ファイルと場所を追加しますfile1
。file2
/path
archive.tar
tar r -f archive.tar file1 file2 -C /path file3 file4
現在の作業ディレクトリに追加され、そのfile1
場所に追加されます。file2
file3
file4
/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
その中にサブディレクトリを作成します。必要に応じて適切なコマンドを使用できます。ただし、現在のディレクトリにある場合は、次のものが必要です。usr
include
usr
stdlib.h
./usr/include
stdlib.h
$ mv usr/include/stdlib.h .
それでは多分rmdir -p usr/include
…これはうまくいきますが退屈です。
--strip=2
タイピング時間を大幅に節約してください。
-C
c
(小文字の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
が表示されます。