今月作成されたファイルだけを取り出したい(bash,awk,date)
apacheやtomcatのログファイルのように(設定にもよると思いますが)ファイル名自体に日付情報を 含めている場合は、特定の期間のログファイルだけを取り出すのは簡単だと思います。
たとえば2007年9月のファイルだけリストアップする場合...
$ ls | grep 2007-09
ファイル名に日付情報が付加されていない場合の対処
しかし、ファイル名に日付情報が付加されていない場合は、どうしたらよいでしょうか。 ファイル自体には、いつ作成されたかのタイムスタンプ情報が含まれているので、 これを元にして特定の期間のファイルを抽出することができます。
$ ls -l | grep 2007 | grep Sep
ls -l オプション付でファイルをリストアップすれば、ファイル名だけでなく、 日付情報他、詳しい情報付でリストアップされるため、それの情報に対して、 適切に grep をかけてやればよいわけです。
しかし、環境によっては(ほとんどのデフォルト環境がそうだと思うのですが) 最近作成したファイルに関しては、年の情報を表示する代りに作成時刻を表示する ようになっています。
私の環境では、(Vine3.2)以下のような感じ...
$ ls -l
-rw-r--r-- 1 moca moca 234 May 22 16:05 README
drwxr-xr-x 2 moca moca 4096 May 22 14:50 lib/
drwxr-xr-x 2 moca moca 4096 May 22 14:50 logs/
-rw-r--r-- 1 moca moca 13480 Jan 5 2006 start.jar
-rw-r--r-- 1 moca moca 1950 Jan 5 2006 stop.jar
--full-timeオプションを使え
man ls として調べてみると、-l 以外に --full-time というオプションが使えることが
わかりました。
これを使うと、以下のように、ファイルの作成日の古い新しいに関係なく、
時刻ではなく、年情報が表示されるようになりました。
$ ls --full-time
-rw-r--r-- 1 moca moca 234 Tue May 22 16:05:29 2007 README
drwxr-xr-x 2 moca moca 4096 Tue May 22 14:50:12 2007 lib/
drwxr-xr-x 2 moca moca 4096 Tue May 22 14:50:52 2007 logs/
-rw-r--r-- 1 moca moca 13480 Thu Jan 05 21:42:15 2006 start.jar
-rw-r--r-- 1 moca moca 1950 Thu Jan 05 21:42:15 2006 stop.jar
したがって、このオプションとgrepを組み合わせて、 たとえば、2007年5月のファイルだけを取り出したい場合は、 以下のようにします。
$ ls --full-time | grep 2007 | grep May
-rw-r--r-- 1 moca moca 234 Tue May 22 16:05:29 2007 README
drwxr-xr-x 2 moca moca 4096 Tue May 22 14:50:12 2007 lib/
drwxr-xr-x 2 moca moca 4096 Tue May 22 14:50:52 2007 logs/
さらに不要な情報を削除し、ファイル名だけを取り出す方法
以上で、カレントディレクトリの特定期間のタイムスタンプを持つファイルだけを リストアップすることができるようになりました。
しかし、この例の例のように数が少なければ、該当ファイルを手でコピーすれば済むかも しれませんが、これらのファイルを取り出して別に処理するのが普通です。 そこで、対象とするファイルだけを、ホームディレクトリにコピーすることにします。
該当ファイル名だけにする
awk を使うと、カラムを指定して、 必要なデータ(ここでは、11カラム目のファイル情報)を簡単に取り出せます。
$ ls --full-time | grep 2007 | grep May | awk '{print $11}'
README
lib/
logs/
これで、該当するタイムスタンプのファイルを抜き出した上で、 さらに、ファイル名情報だけを抜き出しました。
該当ファイルだけをホームディレクトリにコピー
あとは、ホームディレクトリにコピーするだけです。
$ cp ` ls --full-time | grep 2007 | grep May | awk '{print $11}'`
ちなみに、コピーする代りにtarで固めるには、以下のようにします。 (こちらのオペレーションの方が実際は多いでしょうね)
$ tar cvf foo.tar ` ls --full-time | grep 2007 | grep May | awk '{print $11}'`