kakakakakku blog

Weekly Tech Blog: Keep on Learning!

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

GitHub の Releases から tar.gz をダウンロードする場合,普通に展開すると,以下のようにバージョンを含んだディレクトリになる.なお,今回はサンプルとして utils という名前にしている.

$ tar zxvf utils-1.2.3.tar.gz
x utils-1.2.3/
x utils-1.2.3/README.md
x utils-1.2.3/src/
x utils-1.2.3/src/xxx.rb
x utils-1.2.3/src/yyy.rb
x utils-1.2.3/src/zzz.rb

$ tree .
.
├── utils-1.2.3
│   ├── README.md
│   └── src
│       ├── xxx.rb
│       ├── yyy.rb
│       └── zzz.rb
└── utils-1.2.3.tar.gz

2 directories, 5 files

--strip-components 1

そこで --strip-components オプションを使うと,展開後のディレクトリを切り捨てて,第2階層をフラットに展開することができる.

$ tar zxvf utils-1.2.3.tar.gz --strip-components 1
x README.md
x src/
x src/xxx.rb
x src/yyy.rb
x src/zzz.rb

$ tree .
.
├── README.md
├── src
│   ├── xxx.rb
│   ├── yyy.rb
│   └── zzz.rb
└── utils-1.2.3.tar.gz

1 directory, 5 files

--strip-components 2

ちなみに --strip-components 2 とすると,第3階層をフラットに展開することができる.

$ tar zxvf utils-1.2.3.tar.gz --strip-components 2
x xxx.rb
x yyy.rb
x zzz.rb

$ tree .
.
├── utils-1.2.3.tar.gz
├── xxx.rb
├── yyy.rb
└── zzz.rb

0 directories, 4 files

--strip-components 1 と -C

最後に --strip-components-C オプションを使うと,第1階層のディレクトリ名を変更して展開することができる.仕組みとしては -C で指定したディレクトリの直下に --strip-components でフラットに展開することにより,ディレクトリ名を変更したように見える.知っておくと便利だと思う!

$ mkdir utils && tar zxvf utils-1.2.3.tar.gz -C utils --strip-components 1
x README.md
x src/
x src/xxx.rb
x src/yyy.rb
x src/zzz.rb

$ tree .
.
├── utils
│   ├── README.md
│   └── src
│       ├── xxx.rb
│       ├── yyy.rb
│       └── zzz.rb
└── utils-1.2.3.tar.gz

2 directories, 5 files