「tar」でアーカイブされたファイルから、ファイルやディレクトリを指定して展開(取り出す)する方法です。
ファイルを指定してアーカイブを展開
「tar」コマンドで作成されたアーカイブファイルを展開する際、特定のファイルやディレクトリを指定することで、その対象だけを抽出できます。
tar xfv アーカイブファイル.tar ファイル1 ファイル2 ディレクトリ1 tar xfzv アーカイブファイル.tar.gz ファイル1 ファイル2 ディレクトリ1
なお、「v」オプションは展開時の情報を詳細に表示させるためのオプションなので、必要なければ使用しなくても問題はありません。
実行例
取り出す対象を確認するために、「t」オプションを使用してアーカイブ内容の一覧を表示します。
$ tar tfz dir.tar.gz ./dir_01/ ./dir_01/text_03.txt ./dir_01/dir_02/ ./dir_01/dir_02/text_05.txt ./dir_01/dir_02/text_04.txt ./dir_01/text_02.txt ./dir_01/text_01.txt
アーカイブファイルの中から「./dir_01/text_02.txt」「./dir_01/dir_02/text_05.txt」を指定して展開(取り出し)してみます。
$ tar xfzv dir.tar.gz ./dir_01/text_02.txt ./dir_01/dir_02/text_05.txt ./dir_01/dir_02/text_05.txt ./dir_01/text_02.txt
展開したデータを「tree」コマンドで確認すると、指定したデータがアーカイブ元のディレクトリ構造を残したまま取り出されていることが確認できました。
$ tree dir_01 dir_01 ├── dir_02 │ └── text_05.txt └── text_02.txt
ディレクトリも指定できます
ディレクトリを指定してデータを取り出すこともできます。
「dir_02」ディレクトリを指定してアーカイブファイルから取り出してみます。
$ tar xfzv dir_01.tar.gz ./dir_01/dir_02/ ./dir_01/dir_02/ ./dir_01/dir_02/text_05.txt ./dir_01/dir_02/text_04.txt
ディレクトリ構造もそのままで「dir_02」ディレクトリを取り出すことが出来てきます。
$ tree dir_01 dir_01 └── dir_02 ├── text_04.txt └── text_05.txt 2 directories, 2 files
ワイルドカード指定
「--wildcards」オプションを使用すると、ワイルドカード「*」を使って展開するデータを指定することが出来ます。
tar tfv アーカイブファイル.tar --wildcards "*.txt" tar tfzv アーカイブファイル.tar.gz --wildcards "*.txt"
実行例
テスト用として下記のアーカイブファイルを用意しました。
$ tar tfz dir_01.tar.gz ./dir_01/ ./dir_01/text_03.txt ./dir_01/dir_02/ ./dir_01/dir_02/text_05.txt ./dir_01/dir_02/text_04.txt ./dir_01/text_02.txt ./dir_01/dir_03/ ./dir_01/dir_03/image_01.jpg ./dir_01/dir_03/image_02.jpg ./dir_01/image_00.jpg ./dir_01/text_01.txt
「*」(ワイルドカード)を使用して、拡張子が「.txt」のファイルだけを取り出します。
$ tar xfzv dir_01.tar.gz --wildcards "*.txt" ./dir_01/text_03.txt ./dir_01/dir_02/text_05.txt ./dir_01/dir_02/text_04.txt ./dir_01/text_02.txt ./dir_01/text_01.txt
拡張子が「.txt」のファイルのみを取り出すことができました。
$ tree dir_01 dir_01 ├── dir_02 │ ├── text_04.txt │ └── text_05.txt ├── text_01.txt ├── text_02.txt └── text_03.txt 2 directories, 5 files
grepと組み合わせる
「tar tf」コマンドでアーカイブファイルの内容を表示し、その結果をパイプ (|) で「grep」コマンドに渡して検索することで、マッチしたファイルをアーカイブファイルから取り出すことができます。
tar xfv アーカイブファイル.tar $(tar tf アーカイブファイル.tar | grep 条件)
実行例として「.jpg」という拡張子のファイルだけを取り出してみます。
$ tar xfv dir_01.tar.gz $(tar tf dir_01.tar.gz | grep \.jpg) ./dir_01/dir_03/image_01.jpg ./dir_01/dir_03/image_02.jpg ./dir_01/image_00.jpg
無事指定したファイルのみ取り出すことが出来ています。
コメント