🐙

tar.gzで第2階層以下を、指定ディレクトリに展開する

2022/08/08に公開

下記構成のディレクトリが存在しているとき、

$ tree
.
└── target_dir
    ├── test.txt
    └── test2.txt

1 directory, 2 files

target_dirを圧縮して

$ tar zcvf target_dir.tar.gz target_dir

解凍すると、target_dirディレクトリが展開される

.
└── target_dir
   ├── test.txt
   └── test2.txt

下記構成のとき、すでにtarget_dirは存在しているので同階層にtarget_dirに干渉しない形で圧縮ファイルを展開したい場合

$ tree
.
├── target_dir
│   ├── test.txt
│   └── test2.txt
└── target_dir.tar.gz

下記コマンドを入力することでtarget_dir2を作成し、その配下にtarget_dirの中身を展開することができる。

$ mkdir target_dir2 && tar zxvf target_dir.tar.gz -C target_dir2 --strip-components 1

確認

target_dir2配下に展開したファイルが存在していることが確認できる。

$ tree
.
├── target_dir
│   ├── test.txt
│   └── test2.txt
├── target_dir.tar.gz
└── target_dir2
    ├── test.txt
    └── test2.txt

2 directories, 5 files

解説

$ mkdir target_dir2 && tar zxvf target_dir.tar.gz -C target_dir2 --strip-components 1
  1. mkdirでtarget_dir2ディレクトリを作成。
  2. -Cオプションで指定のディレクトリへ展開。
  3. --strip-components 1 で、第1階層を切り捨てて第2階層以下を展開する。(strip-componentsで指定する数字で切り捨てたい階層を指定できる)

参考

tar の --strip-components と -C オプションを使ってスマートに展開する

Discussion