5

私は今 tar.gz を持っています。そこから 1 つまたは 2 つのファイルを抽出し、それらを新しい tar.gz にまとめて一度に追加したいと考えています。もちろん、一時ファイルに保存して作業することもできますが、絶対的な要件は、中間ファイル出力、つまりパイピングなしでこれをすべて行うことです。つまり、私が望むのは、次の疑似コードのようなものです (明らかに構文が正しくありません)。

tar -xvf first.tar.gz subdir1/file1 subdir2/file2 | tar cf - | gzip > second.tar.gz

誰かがこれの適切な構文を知っていますか? 私は多くの変種を試しましたが、役に立ちませんでした。

私は cpio を使用するという考えにも非常にオープンですが、構文を適切に取得する方法に困惑しています。私が理解していることから、cpio はファイルではなくアーカイブまたはファイル名のみを取り込みます。

どんな助けでも大歓迎です。

編集: 抽出する tarball 内に特定のファイル名パターンはありません。BSD と GNU tar が一度に 1 つのパターンしか検索できないことを考えると、それぞれ include/exclude フラグを使用できるかどうかさえわかりません。

4

4 に答える 4

4

GNU tarを使用しているか、入手できると仮定しています。

このオプションを使用して、--deleteある tar ファイルを別の tar ファイルに処理できます。例えば:

% tar cf x.tar a b c d
% tar tf x.tar
a
b
c
d
% cat x.tar | tar f - --delete b c > y.tar
% tar tf y.tar
a
d
%

複数の名前を指定して削除できることに注意してください。次に、保持するファイルではなく、削除するすべてのファイルをコマンド ラインで指定する方法を理解する必要があります。

于 2012-07-13T02:50:27.730 に答える
2

抽出しようとしているファイル名のパターンがわかっている場合は、これを試してください。

tar zcf second.tar.gz --include='filepattern' @first.tar.gz

複数のファイルを含める例を次に示します。

% tar cf x.tar a b c d
% tar tf x.tar
a
b
c
d
% cat x.tar | tar cf - --include='a' --include='d' @- > y.tar
% tar tf y.tar
a
d
%
于 2012-07-13T03:18:37.537 に答える
0

解凍するとき、tar は通常、出力ストリームではなく、解凍されたファイルをディスクに書き込みます。-O または --to-stdout を使用して、ファイルを stdout に書き出すことができますが、ファイル間の切れ目や、ファイルの終了と開始を知る方法はありません。

さらに、tar の create オプションは、stdin からではなく、ディスクからのみファイルを読み取ることができます。これは、あるファイルがいつ終了し、別のファイルがいつ始まるかを知るという前述の問題のため、理にかなっています。

これは、コマンド ラインから希望どおりにこれを行う方法がないことを意味します。

ただし、メモリ内で厳密に操作できるライブラリを使用して、perl または python スクリプトを作成できると思います。

于 2012-07-13T02:44:10.697 に答える