はじめに
Dockerのイメージファイルをダウンロードしてビルドするように言われたんですが,Dockerに詳しくないせいでイメージのtarファイルを不要に展開してしまい,他のファイルもある中で展開されたファイルだけを消すのに難儀したので,削除用に作ったコマンドを備忘録として残しておきます。
例
Dockerのイメージファイルを,それが置かれているディレクトリ上に展開した後,再び展開する前の状態に戻します。
前提として,tarが置かれているディレクトリには展開されたtarとその中身以外にも色々ファイルが存在します。
Dockerイメージのレイヤー情報を格納しているディレクトリは名前がハッシュ値になっていることもあって,ls結果をgrepしてxargsに食わせる,みたいなことがやりにくそうですね。
$ ls
wordpress.tar ww www wwww ...
$ tar -xf wordpress.tar
$ ls
10313414698f0d9534f6385fb5d2756ef4377cf30f1e44711820b6af89b75f1b
259ef3fc24ff14247efd1da3731449ec6ab5aa10d356640cec980c52b8a8f43e
2909b2b6c2d0c1ecd9ba082bb938a32883d016e6900ca4981c9e81983d51e90b
...
manifest.json
repositories
wordpress.tar
ww
www
...
コマンド
tar -tf <tar name> | awk -F'[/]' '{print $1}' | uniq | xargs rm -r
あるいは
tar -tf <tar name> | cut -d'/' -f1 | uniq | xargs rm -r
※tarが置かれているディレクトリで実行することを想定しています。
※※ユーザーがカレントディレクトリに対して読み書きの権限を持っていない場合はrmに-fオプションが必要です。
基本的には,展開元のtarの中身をxargsに渡すという考え方です。
tar -tの出力は以下のようになります。
$ tar -tf wordpress.tar
10313414698f0d9534f6385fb5d2756ef4377cf30f1e44711820b6af89b75f1b/
10313414698f0d9534f6385fb5d2756ef4377cf30f1e44711820b6af89b75f1b/VERSION
10313414698f0d9534f6385fb5d2756ef4377cf30f1e44711820b6af89b75f1b/json
10313414698f0d9534f6385fb5d2756ef4377cf30f1e44711820b6af89b75f1b/layer.tar
259ef3fc24ff14247efd1da3731449ec6ab5aa10d356640cec980c52b8a8f43e/
...
ディレクトリはディレクトリとしてまとめて削除するのが一番効率が良さそうなので,awkやcutで/を区切り文字とした第1フィールドを取得したのち,uniqで重複を取り除きます。
(余談:dirnameコマンドが使えるかと思ったんですが,最上位に置かれているファイルに対して適用すると出力が.になってしまうためボツになりました。)
実行結果は以下のとおりです。
$ tar -tf wordpress.tar | cut -d'/' -f1 | uniq | xargs rm -r
$ ls
wordpress.tar ww www wwww ...
おわりに
rm -rがファイルもディレクトリも削除できる仕様で良かったです。
tar -tが表示するファイルの階層を指定できると尚良かったんですが,manを見た感じではなさそうでした。
もっといいやり方があれば教えてください。
最後までご覧頂きありがとうございました。