1. 概要

tar コマンドを使用すると、複数のファイルをアーカイブにパッケージ化できます。これは「tarball」とも呼ばれます。 特定の種類のファイルをアーカイブしたい場合があります。

このクイックチュートリアルでは、それを実現する方法について説明します。

2. 例

デモンストレーションと説明を簡単にするために、まず、例を作成しましょう。

$ tree app
app
├── app.config
├── data
│   ├── app.data
│   ├── orders.cache
│   └── orders.csv
├── log
│   ├── app.log
│   └── login.log
└── program
    └── Application.class

3 directories, 7 files

上記の出力が示すように、いくつかのサブディレクトリとファイルを含む「app」という名前のアプリケーションディレクトリがあります。

ここで、すべてのログファイル(*。log)とデータファイル(*。csv*。data)をアーカイブする必要があるが、キャッシュを除外する必要があるとします。 tarballでファイルします。

問題を解決するために「分割統治」法を採用することができます。

  • 必要なファイルを見つける
  • 見つけたファイルのアーカイブ

次に、それらの動作を見てみましょう。

3. findコマンドを使用して必要なファイルを検索する

最初のステップは、必要なファイルを見つけることです。

したがって、ここでは、 appディレクトリの下に*。log*。csv、または*。dataファイル名のファイルを見つける必要があります。拡張機能。 これは、findコマンドが得意とする種類の仕事です。

$ find app -name *.data -o -name *.csv -o -name *.log
app/data/orders.csv
app/data/app.data
app/log/login.log
app/log/app.log

上記のfindコマンドでは、 -o演算子(論理OR)を使用して3つの名前式を結合し、必要なファイルを取得しました。

または、正規表現でファイルを見つけることもできます。

$ find app -type f -a -regex '.*[.]\(data\|csv\|log\)$'
app/data/orders.csv
app/data/app.data
app/log/login.log
app/log/app.log

今回は、 -a 演算子(論理 AND )を使用して、正規表現と「タイプのf」式を結合しました。

findがデフォルトの正規表現タイプとしてfindutils-defaultを使用していることは言及する価値があります。 -regextype オプションを使用して、別の正規表現タイプを割り当てることができます。

たとえば、 egrep タイプを使用してエスケープを保存し、コードを読みやすくすることができます。

find app -regextype egrep -type f -a -regex '.*[.](data|csv|log)$'

find は、コマンド「 find -regextype help 」を実行すると、サポートされているすべての正規表現タイプを一覧表示します。

4. 見つかったファイルのアーカイブ

これまでのところ、必要なすべてのファイルが見つかりました。 それでは、アーカイブを作成しましょう。 つまり、findコマンドの結果をtarコマンドになんらかの方法で渡す必要があります

私たちの多くは、findtarを連携させるために、コマンド置換アプローチを思い付くかもしれません。

$ tar -cf app-data.tar $( find app -name *.data -o -name *.csv -o -name *.log )

その後、作成したapp-data.tarファイルの内容を確認できます。 このアプローチは、問題の例で機能することがわかります。

$ tar -tf app-data.tar 
app/data/orders.csv
app/data/app.data
app/log/login.log
app/log/app.log

コマンドは非常に簡単です。 ただし、検索の出力に多数のファイルが含まれていると失敗する可能性があり、「引数リストが長すぎます」というエラーメッセージが表示されます。

次に、問題を解決するためのより堅牢な方法を見てみましょう。

$ find app -name *.data -o -name *.csv -o -name *.log | tar -cf app.tar -T -

上記のコマンドをすばやく実行してみましょう。 findの部分は私たちにとって目新しいものではありません。 tarコマンド部分を見てみましょう。

-T FILE オプションは、ファイルリストを含む FILE を提供し、tarコマンドにこのリスト内のファイルをアーカイブするように指示します。 上記のコマンドでは、「 -T –」を使用しました。 ここでの-Tの後の「」は、標準入力( stdin )を意味します。

find は、ファイルリストをtarコマンドにパイプします。 したがって、tarstdinは、findの出力によって供給されます。 したがって、 tar は、findがパイプインしたすべてのファイルをアーカイブします。

最後に、tarballに予想されるファイルが含まれているかどうかを確認しましょう。

$ tar -tf app.tar
app/data/orders.csv
app/data/app.data
app/log/login.log
app/log/app.log

5. 結論

この記事では、findおよびtarコマンドを使用して特定のタイプのファイルをアーカイブする方法について説明しました。

また、コマンド置換アプローチが失敗する理由についても説明しました。