ディレクトリの内容から.tgzを作成したいと思います。また、./
tarの内容から先行する""を削除したいと思います。
これが私がする方法です:
cd /path/to/files/ && find . -type f | cut -c 3- | xargs czf /path/to/tgz/myTgz.tgz
私最近学んだことcmdline引数リストが長すぎると複数回呼び出される可能性があるため、を使用することはこれを達成するためのxargs
最良の方法ではない可能性がありxargs
、標準入力から入力ファイルのリストを読み取る機能を利用することをお勧めします。結局は知りました。tar
tar
この記事これを行う方法について。ところでこの推薦を見たのに..
cd /path/to/files/ && find . -type f | cut -c 3- | tar czf foo.tgz -T -
...携帯するのは不便だと思います。私の開発PCではうまく動作しますが、busyboxのターゲットでは同じコマンドを実行すると次のエラーが発生します。
tar: can't open '-': No such file or directory
だから私の質問tar
:標準入力(コマンドライン引数ではなく)から提供されたファイルを呼び出す真の移植性/グローバル方法はありますか?.tgz
( //tar
などの代替手段をインストールするオプションはありません。)gnutar
bsdtar
(2番目の質問:-T -
「パラメータがtar
」を意味するのはなぜですか?次からファイルを読むstdin
tar
マニュアルページでは、「-T
」の意味のみを見つけることができます。
FILEから抽出または生成する名前を取得する
-
...しかし、一般的な""への参照は表示されません。)
答え1
-
これは、ファイル名が入力として必要なときに標準入力を解釈し、ファイル名が出力として必要なときに標準出力を解釈する一般的な規則です。これは一般的なルールなので、GNU tar のマニュアルページの短いヘルプの概要には記載されていません。完全なマニュアル(しばしば現地で使用可能info tar
)。これPOSIXコマンドラインユーティリティ構文ガイドこのルールは含まれているのでかなり広範囲です(ただし、常にプログラムの作成者の選択です)。
BusyBoxユーティリティはこの規則に従います。しかし、手動tar
このオプションのサポートについての言及はなく、-T
私が公開したコンピュータバージョン(Ubuntuの場合は1.27.2)もありません。 「無効なオプション - 'T'」の代わりに「:そのファイルまたはディレクトリがありません」というエラーが表示される理由がわかりません。引数なしでオプションとして解釈し、ファイル名として扱うようtar
です。この場合、tar-T
-
ファイル名一部だけではなくアーカイブに入れるコンテンツファイルでstdin / stdout解析を使用することは意味がありません-
。
BusyBoxユーティリティは組み込みシステム用に構築されているため、限られた機能セットをサポートするように設計されており、GNUユーティリティの高度な機能はこれらのシステムには適していません。明らかに-T
、BusyBoxデザイナーはこれが便利な機能だとは思わなかった。
BusyBox tarには、標準入力からファイル名を読み取る方法がないと思います。アーカイブディレクトリにファイルのサブセットが必要で、アーカイブにシンボリックリンクが必要ない場合、回避策は一時ディレクトリにシンボリックリンクフォレストを作成してこの一時ディレクトリを保持することです。
なぜそれを使用しているのかは不明ですfind
。現在のディレクトリにあるファイルだけが必要ではありませんかtar czf /path/to/archive.tgz -- *
?サブディレクトリが存在し、そのサブディレクトリにファイルをアーカイブし、ディレクトリ自体をアーカイブしたくない場合(おそらくディレクトリ構造が必要ですが、別の権限を使用してファイルを復元したい場合)、コマンドは適切です。この場合、先に進むことは./
何の害にもなりません。
答え2
私はこれが愚かな答えであり、おそらくあなたには良くないかもしれないことを知っていますが、もしあなたが...
cd /path/to/files/ && find . -type f | cut -c 3- >/tmp/temp.txt
tar czf foo.tgz -T /tmp/temp.txt
答え3
-u/--update
このオプションを一緒に使用できますxargs
。試してみて、うまくいくことを証明しました。以下をtar
使用して、ファイル名パラメータを1つずつ指定しましたxargs -n 1
。
find top_of_tree/ -type f | xargs -n 1 tar -uf archive.tar
もちろん、これは単なる概念証明です。あなたの場合、xargs
大量の呼び出しを避けるために、引数リストを引数の長さ制限を超えないより大きな部分に分割することを許可する方がより実用的かもしれませんtar
。
find top_of_tree/ -type f | xargs tar -uf archive.tar
前提条件は、tar
プラットフォームのすべての実装が-u/--update
これらのフラグの1つ以上をサポートすることです。
編集:-u/--update
フラグを使用すると、tar
アーカイブを作成して追加できます。
-c
残念ながら、圧縮されたアーカイブ(tgz、対応するフラグで生成)を更新できないことを確認しました。ただし、とにかく圧縮されていないアーカイブを作成してから結果を圧縮できます。
tar
また、ハイフン ("-" 文字) を含むフラグを使用しても混乱しません。両方の形式を許可します。私の場合はあなた-uf
のようですuf
。
このオプションについては、-
マニュアルページに文書化されていません。tar
これは、ストリームと名前付きファイルを処理するコマンドラインツールの非常に一般的なUnixルールであるためです。
-
通常、フィルタの特殊引数であり、標準入力ストリームをファイルと呼びます。
答え4
この記事は役に立ちましたが、以下は特定のファイルシステムのフォルダ構造をバックアップし、tarがstdinからそのフォルダ構造を読み取るという実際の例です。
find /kelinda/ -type d | tar cvf /tmp/kelinda.folders.tar --no-recursion -T -
注:/ kelindaは外付けハードドライブ上のファイルシステムにすぎません。
したがって、findを使用して目的のリストを見つけてtarにパイプすることができます。 "-T -"は標準入力(他の記事で述べたように)から入力ファイルを読み込み、tarが望ましくない他のファイルをバックアップしないように "--no-recursion"を追加しました。
つまり、--no-recursionオプションと一緒にfindを使用すると、ファイルおよび/またはフォルダの正確なリストをバックアップし、「-T -」オプションと組み合わせて次の内容を読み取ることができます。標準入力の入力として。