1. 概要

この短いチュートリアルでは、コマンドのいくつかの利用可能な組み合わせを調べて、ファイルのセットを見つけ、それらをtarballに圧縮します。

この目的のために、以下を見ていきます。

  • find 、さまざまなフィルターとオプションでファイルを検索できます
  • tar 、指定された入力ファイルをアーカイブに圧縮します

さらに面倒なことはせずに、私たちのオプションを見てみましょう。

2. ソリューション

混乱を避けるために、現在のディレクトリ内のすべてのファイルをtarするという非常に基本的なユースケースを中心に例を示します。

2.1. コマンド置換の使用

まず、コマンド置換を使用して find を実行し、その出力をtarに提供する最も簡単なソリューションを考えてみましょう。

$ tar -czf archive.tar.gz `find . -type f`

これは非常に簡単なアプローチですが、このコマンドは名前にスペースが含まれるファイルを処理しませんfindコマンドが「helloworld.txt」という名前のファイルを出力に返すとします。 find は、ファイル名を引用符で囲んだり、出力のファイル名内の空白文字をエスケープしたりしないため、tarコマンドはこれを2つのファイル引数として認識します。helloおよびworld.txt。 したがって、ファイルはアーカイブに追加されません。

2.2. xargsを使用する

もう1つの簡単なオプションは、xargsを使用してfind出力をtar引数に変換することです。

$ find . -type f | xargs tar -czf archive.tar.gz

残念ながら、スペースは、xargsが引数を分割するために使用するデフォルトの区切り文字であるため、前のものと同じ欠点があります。 ただし、今回は、 -d オプションを使用して区切り文字を別の文字に変更することで、簡単に修正できます。

$ find . -type f | xargs -d "\n" tar -czf archive.tar.gz

2.3. find-print0を使用する

最後の例は機能しますが、予期しない結果を回避するために、通常はnull文字区切り文字を使用することをお勧めします。 これは、デフォルトの区切り文字をnullに置き換えるfind-print0を使用して簡単に実現できます。 また、 tar –null を使用して、改行の代わりにこの文字でファイルを分割します。

$ find . -type f -print0 | tar -czf archive.tar.gz --null -T -

ただし、 -print0は最後の条件にのみ適用されるため、複数ある場合は、かっこで囲む必要があります

$ find . \( -type f -o -name '*.c' \) -print0 | tar -czf archive.tar.gz --null -T -

ここでは、同等の xargs の代わりに、 tar -T –を使用してstdinにリストされているファイルを圧縮していることに注意してください。

2.4. ファイルの使用

検討する次のアプローチでは、中間ファイルを使用して保存します探す出力してから、同じファイルを入力として使用しますタール。 このソリューションは、ログまたはさらなる処理のために圧縮しているファイルを追跡する場合に便利です。

$ find . -type f > archiveFileList && tar -czf archive.tar.gz -T archiveFileList

2.5. find-execを使用する

最後に、見つかったファイルごとに1つずつ、複数のアーカイブを作成するという少し異なるシナリオを考えてみましょう。 これを行うために、 find -execを使用できます。これにより、一致したファイルごとに特定のコマンドが実行されます。 さらに、中括弧のペアで参照することにより、現在のファイル名を使用できます。

$ find . -type f -exec tar -czf {}.tar.gz {} \;

3. 結論

この投稿では、いくつかのファイルを見つけてtarアーカイブに入れるためのさまざまなオプションを検討しました。

コマンド置換とxargsは一般的に単純ですが、 find-print0はより堅牢なソリューションと見なされます。 最後に、中間ファイルと find -exec の使用は、特定のユースケースでのみ推奨されます。