はじめに
MacやWindowsで通常作業している際、ファイルの圧縮はGUIのツールでやる事が多かった。Linuxでも個別にファイルを圧縮する場合はGUIでもコマンドラインでも簡単に出来る(ググればすぐ情報が出てくる)
しかし、例えば沢山あるディレクトリ群を各個、個別にアーカイブ化したいなんて時には、一個ずつ手でやっていたら面倒くさくてしょうがない。MacやWindowsにはそういう設定が出来るツールがあるので、普段はそれを使ってチョイチョイっと終わらせているけど、Linuxの物は勉強不足で知らない。
じゃー、UNIXらしくコマンドラインでやれば簡単に出来そうだけど、具体的にはどうしたら良いの?という話。
要件
- OSはUbuntu 16.04 LTS
- 操作はコンソールからコマンドラインで
- 対象は複数のディレクトリに格納されたソースが点在
- これらを個別にアーカイブ化したい
- とりあえずtar.xzにする
さてやってみよう
どうやらfindとsed、xargsを組み合わせていけるらしい。当然アーカイブ化、圧縮にはtarとxzも必要です。入っていない場合はapt-getしてください。
詳細の解説は後からするとして、まず最終形態を。
$ find -mindepth 1 -maxdepth 1 -type d | sed 's!^.*/!!'|xargs -I% tar -Jvcf %.tar.xz %
各ブロックの説明
まずfindで階層をカレントのみに限定し、ディレクトリのみを対象として名前を列挙。
それからsedで、出てきた文字列を整形してディレクトリ名のみにします。
最後に、渡されたディレクトリ名を使って圧縮対象とアーカイブ名を指定して圧縮。
コンナカンジ。
各オプションの説明
-mindepth 1
これをしないと結果に「.」(カレントディレクトリ)が入ってしまうため
-maxdepth 1
自分のいる階層のみを対象とする為
-type d
ディレクトリーのみを対象とするため
sed 's!^./!!'*
カレントのみ対象とすると「./〜」という感じで頭にいらないものがつくので置換して消している
-I%
指定した記号(%)を渡された文字(ディレクトリ名)で置換する。この文字は好きな記号で良いみたい。
問題点
理想としては、処理しているフォルダー名を順次表示し、圧縮対象のファイルは冗長なので見せない様にしたい。どうやるのかパッと思いつかなかったので保留。誰かオシエテ。
応用編
応用するとディレクトリをまとめて消したり出来ますな。
$ find -mindepth 1 -maxdepth 1 -type d | sed 's!^.*/!!'|xargs -I% rm -Rf %
いきなり実行するのコエーよって場合は一度何が対象になるか表示してみると良いかもしれない。
$ find -mindepth 1 -maxdepth 1 -type d | sed 's!^.*/!!'|xargs -I% echo %
このsedでやっている処理はawkなんかでも出来るし、もっと簡潔な方法があるかもしれないネ。