次のようなものを使用できます:
find var/log -iname 'anaconda.*' -print0 | tar -cvf somefile.tar --null -T -
-print0 と -T スペース、改行などを含むファイル名を許可するために連携して動作します。最後の - 標準入力から入力ファイル名を読み取るよう tar に指示します。
-print0 に注意してください この回答に従って、ステートメントの最後に来る必要があります。そうしないと、予想よりも多くのファイルを取得する可能性があります。
注: より効率的な解決策については、@Iain の回答を参照してください。
find に注意してください -exec を呼び出します すべてのファイルに対するアクション
tar -cvf file.tar {} を実行した場合 各ファイル find ごとに 出力、これは file.tar を上書きすることを意味します 毎回、anaconda.storage.log のみを含む 1 つのアーカイブが残ってしまう理由が説明されています。 — 最後のファイル find です 出力します。
ここで、実際に追加したい ファイルを毎回作成するのではなく、アーカイブに保存します (これが -c オプションです)。したがって、以下を使用してください:
find var/log/ -iname "anaconda.*" -exec tar -rvf file.tar {} \;
-r オプションは、毎回アーカイブを再作成するのではなく、アーカイブに追加します。
注: -iname anaconda.* を置き換えます -iname "anaconda.*" で .アスタリスクはワイルドカードで、find より前にシェルで展開できます それさえ見ます。この展開を防ぐには、引数を二重引用符で囲みます。
tar について 先頭の / を削除 :アーカイブには relative のみを含める必要があります ファイル名。 / で始まるファイルを追加した場合 、それらはabsoluteとして保存されます ファイル名、文字通り /var/… を意味します たとえば、コンピューターで。
IIRC これは単に tar に対する予防措置です /var/… で実際のデータを上書きしないため、この方法の方が安全です。 相対ファイル名が含まれている場合にアーカイブを抽出するとき。
これを試してください:
tar -cvf file.tar `find var/log/ -iname "anaconda.*"`
find を使用しようとしていました -exec tar へ .しかし、-exec の方法 オプションが機能すると、一致するファイルが見つかるたびにそのコマンドが 1 回実行され、tar が発生します。 毎回生成される tar ファイルを上書きします。それがあなたが最後のものだけになってしまった理由です。また、 find に指定するパターンを引用符で囲む必要があります find に渡す前にシェルが展開しないようにする .
バッククォートによるコマンド置換の使用 (または $(...) の使用) find によって生成された名前の完全なリスト tar への引数としてコマンドラインに貼り付けられます 、一度にすべてを書き込みます。