小技プログラミング

findコマンドを活用してタイムスタンプでファイルを検索する

1.findコマンドでタイムスタンプ検索

findコマンドでは、atime, ctime, mtimeオプションでタイムスタンプを指定してファイルを検索することができます。

atime ... 最終アクセス日時
mtime ... 最終変更日時
ctime ... 最終ステータス変更日時

ちょっと解り辛いので実際に活用事例をあげてみます。
※以降の例では /home ディレクトリを対象に検索しています。
例えば、現在~7日前までにアクセスがあったファイルを調べるには、以下のよう指定します。
(構文)find <ディレクトリパス> -type f -atime -<日数>

# find /home -type f -atime -7

次に、7日前以前にアクセスされたファイルを調べる場合。
※過去7日分は対象外にしていることになります。
(構文)find <ディレクトリパス> -type f -atime +<日数>

# find /home -type f -atime +7

最後に7日前にアクセスがあったファイルを調べる場合。
日にちには何日前なのかを指定します。
(構文)find <ディレクトリパス> -type f -atime <日にち>

# find /home -type f -atime 7

このように-と+を付ける事により範囲を指定する事ができます。
また、ファイルではなくディレクトリを対象にしたい場合は、
 -type fの部分を -type dと指定します。
すべてを対象にしたい場合は -type fを省きます。

2.findコマンド応用編

実現する内容は以下の通りです。
・特定共有内で現在~180日前に格納ファイルにアクセスが一つもないサブディレクトリをすべて検索
・対象ディレクトリをディレクトリ構成を維持したまま/remove/共有ディレクトリ名/配下へ移動
・移動したディレクトリのリストを作成し保存

#!/bin/bash
fname=removelist_`date '+%Y%m%d'`.txt #ログファイル名
log=/remove/$fname #ログファイルフルパス
period=180 #移動対象日数

# /removeディレクトリがなければ作成
if [ ! -d /remove ]
then
mkdir -m 777 /remove
fi

echo `date '+%Y年%m月%d日'`"から"${period}"日間格納ファイルに対してアクセスがないディレクトリリスト" > ${log}
echo "" >> ${log}

# shareディレクトリ
# share共有内の1階層を対象とする場合
if [ -d /share ]
then
for sharedir in `ls -l /share/ | awk '$1 ~ /^d/ { print $9 }'`
do
if [ -d /share/$sharedir/ ]
then

for subdir in `ls -l /share/$sharedir/ | awk '$1 ~ /^d/ { print $9 }'`
do

if [ -d /share/$sharedir/$subdir/ ]
then

count=`find /share/$sharedir/$subdir/* -atime -$period -type f|wc -l`

if [ $count -eq 0 ]
then

echo /$sharedir/$subdir/ >> ${log}
mv -f /share/$sharedir/$subdir /remove/$sharedir/

fi
fi
done
fi
done
fi

chmod 777 ${log}
chgrp DomainUsers ${log}

以上、使い方次第では色んな活用が出来る便利なfindコマンドの紹介でした。