ミッションたぶんPossible

どこにでもいるシステムエンジニアのなんでもない日記です。たぶん。

Linuxサーバから特定のファイル群をピックアップしてファイルサイズ合計を計算する

 今月は2014ブラジルW杯月間につき、ブログは更新する気が無かったのですが……。せっかく書いたものを忘れても困るので、備忘録的にメモメモ。


 特定の名称ルールでサーバに保存してあるファイル(画像)を一括削除する前に、どのくらいファイル容量なのかを確認するためのコマンドです。出力されるファイルサイズ合計の単位は「バイト」です。

$ find ./ -exec ls -ld {} \; | grep "hogehoge\|fugafuga\|mogemoge\|.jpg"|grep -v "drwxrwxrwx" | cut -d " " -f 5 |awk 'BEGIN {sum=0} {sum+=$1} END {print sum}'

 これだけだとなんのこっちゃかわからんので、簡単に解説します。

find -exec

 ファイルを検索します。-execオプションを付けることで、直後に指定したコマンドを対象のファイル全てに実行します。これだと、直下のディレクトリ配下のファイル全てに「ls」コマンドを-ldオプションを付けて実行したことになります。

grep

 出力する内容を指定した条件で絞り込みます。これだと、ファイル名に「hogehoge」「fugafuga」「mogemoge」が含まれるもののみが出力されるようになります。

grep -v

 同じgrepコマンドでも「-v」オプションを指定すると、その文字列を含むものは除外されます。今回はディレクトリを検索対象外にしたかったので、アクセス権限の部分を除外文字列として指定しました。ファイルのアクセス権限が異なるときちんと除外されないで引っかかっちゃうので注意しましょう。

cut

 出力した内容を一部を切り出します。「-d」オプションでデリミタを指定し、「-f」オプションで、「-d」で区切りを入れた際の前から何番目の領域を切り取るか、を指定します。
ls -lコマンドの場合

'-rwxrwxrwx 52 root root 4096 hogehoge.jpg 19:23 9200

という出力になります。「-d」オプションで「" "」、つまり半角空白を指定すると「-rwxrwxrwx」「52」「root」「root」「4096」「hogehoge.jpg」「19:23」「9200」に分割されるので、「-f」オプションで「5」を指定した場合、ファイルサイズを示す「4096」が取得できるようになります。

awk

 ちょっと複雑な条件を指定できるフィルタリングコマンドです。今回は指定した値を全て合算するような指定を行いました。オレもよう分からんので説明は割愛。