複数のアーカイブで、特定のファイル内を検索する

目的

ディレクトリ内に複数のアーカイブファイルが有ります。
それらの中の、特定のファイルの中身をテキスト検索します。

環境

Linuxのターミナル。

実現方法

Step 1. アーカイブファイルを一覧表示。

複数のアーカイブファイルが入っているディレクトリを /data とします。
また、アーカイブファイル名は file01.tar.xz や file02.tar.xz と仮定します。
手始めに、これらをリスト表示します。

1
find /data -type f -name "file*.xz"

これで、

1
2
/data/file01.tar.xz
/data/file02.tar.xz

のように表示されたら、成功です。

Step 2. アーカイブファイル内のパスを調査。

検索したいファイルの名前を sample.txt とするならば、アーカイブファイル内でのパスを次のように調べます。

1
tar -tf /data/file01.tar.xz | grep sample.txt

その結果、パスが得られます。たとえば、このように表示されるはずです。

1
foo/bar/sample.txt

Step 3. 検索

検索したいテキストが target_text であれば、これまでの結果から、次のように検索できます。

1
find /data -type f -name "file*.xz" | xargs -I {} sh -c "ls -l {}; tar -xf {} foo/bar/sample.txt; cat -n foo/bar/sample.txt | grep target_text"

コマンドの解説です。
最初に、Step 1 でのファイル検索を行っています。
その各ファイルに対して、ls -l でファイルパスを表示し、cat -n によって行番号付きで中身を読み出し、それに対して、grep でテキスト検索しています。

注意点

上述のコマンドを実行すると、実行したディレクトリ内に foo/bar/sample.txt が展開されてしまいます。同名のファイルが存在すると上書きされてしまうので、気をつけてください。

共有