GNU/Linux >> Linux の 問題 >  >> Linux

「tar」コマンドと「find」コマンドを組み合わせる方法

次のようなものを使用できます:

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


Linux
  1. findコマンドを使用してLinux上のファイルとディレクトリを検索します

  2. コマンドラインを使用してLinuxでtar.gzファイルを抽出する方法

  3. 出力をファイルに追加する方法は?

  1. LinuxでTarコマンドを使用する方法

  2. findコマンドを使用して権限を監査する方法

  3. 最大のファイル記述子を持つプロセスを見つける方法は?

  1. 1 つのコマンドで .tar.gz ファイルを開く

  2. tr コマンド - 文字列 \n を実際の改行 (\n) に置き換える方法

  3. デフォルトのファイルマネージャを見つける方法は?