次のようなものを使用できます:
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
への引数としてコマンドラインに貼り付けられます 、一度にすべてを書き込みます。