このサイトを参考に。
理屈も大事だけど、とにかくカタチを覚えちゃって、そっから使っていくのがLLだと思う。
awkだと、こんな感じで覚えた。
$ ls -al | awk ''
$ ls -al | awk '{}'
$ ls -al | awk '{print}'
$ ls -al | awk '{print $0}' ←ls -al と同じ
$ ls -al | awk '{print $1}' ←ls -al の1列目だけ表示
$ ls -al | awk '{print $9}' ←ls -al の9列目だけ表示
$ ls -al | awk '{print $1,$9}' ←ls -al の1列目と9列目だけ表示
$ ls -al | awk '$ {}'
$ ls -al | awk '$ {print}'
$ ls -al | awk '$ {print $1}'
$ ls -al | awk '$5 {print $1}'
$ ls -al | awk '$5== {print $1}'
$ ls -al | awk '$5==0 {print $1}' ←5列目がゼロだったら、1列目だけ表示
$ ls -al | awk '$5==0 {print $1,$9}' ←5列目がゼロだったら、1列目と9列目だけ表示
実際やってみる。
こういうフォルダがあったとして
1列目 ファイルパーミッション
5列目 ファイルサイズ
9列目 ファイル名
1列目だけ表示。
$ ls -al | awk '{print $1}'
9列目だけ表示。
$ ls -al | awk '{print $9}'
こっからが本題。
ファイルサイズがゼロの場合 の処理。
**が**だったら、という条件文を、awkでどうやるか という話。
5列目(ファイルサイズ)がゼロだったら、1列目だけ表示
$ ls -al | awk '$5==0 {print $1}'
5列目(ファイルサイズ)がゼロだったら、1列目と9列目だけ表示
$ ls -al | awk '$5==0 {print $1,$9}'
5列目(ファイルサイズ)がゼロだったら、1列目と5列目と9列目だけ表示
$ ls -al | awk '$5==0 {print $1,$5,$9}'
ファイルサイズがゼロの行だけ取得できた。
ここまでくればコッチのモン。
まずはフォルダを除く。
1列目の先頭がdrwで始まっているものを除く。
$ ls -al | egrep -v ^drw.* | awk '$5==0 {print $1,$5,$9}'
ファイルだけになった。
ファイル名だけにする。9列目だけあればいい。
$ ls -al | egrep -v ^drw.* | awk '$5==0 {print $9}'
これを、rm -rfの引数に与えればいい。
`` で囲む。
$ rm -rf `ls -al | egrep -v ^drw.* | awk '$5==0 {print $9}'`
見事に、ファイルサイズゼロのファイルだけが消えた。
変更前はこう
※さらに、ファイル名に半角入っていることを考慮して""でも囲んでおいたほうが良かったかもしれない。
$ rm -rf "`ls -al | egrep -v ^drw.* | awk '$5==0 {print $9}'`"
けど、今回はそんなファイル無かったし、良しとする。