PR

【Ubuntu】tarでアーカイブされたファイルから特定のファイルやディレクトリを指定して取り出す方法

「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

無事指定したファイルのみ取り出すことが出来ています。

コメント

タイトルとURLをコピーしました