【UNIX】findコマンドでファイルの日付を比較して抽出する方法
2018/03/17
あるディレクトリに画像(などの)ファイルが多数存在する場合に「期間」を条件として対象ファイルを抽出したいと思いました。その場合の findコマンドの使い方です。
findコマンドで期間指定する
findの使い方
文法
1 |
find . ! -newer [比較用ファイル名] -print |
実例1 (普通の一覧表示)
2010010413010910.jpg が、比較用のファイル。
作成年月日が 2010.01.04 とします。
1 2 3 4 5 6 7 8 9 10 |
find . ! -newer 2010010413010910.jpg -print ./756dd0cfc10d94e5d8af57b6f240ce5b.jpg ./a0c7e33d200441888ee1912a7bb491f2.jpg ./1decdba76b4b134e4121dc70ab444b5d.jpg ./2bf27f1e9b61a18859bc31c916a62b24.jpg ./6fbb82aa701e7efdd17a351f23871d6a.jpg ./5bb1296814b8dcabc13c4a75d879960a.jpg ./b8372f70b61d8b8748b22b003c80f4e8.jpg ./86df56633c53472ba40cc9b1b98541e5.jpg 以下略 |
「-newer」オプションの否定形(「!」)という形で条件を作成しており、比較ファイルより古いものが抽出・表示されます。
もちろん否定をなくせば、新しいものが表示されます。
なお、「.」はカレントディレクトリの意味です。
実例2 (詳細表示)
同じようにし、より詳細情報を表示したい場合は -exec オプションと ls -l オプションを繋げて以下のようにします。
1 2 3 4 5 6 7 8 9 10 11 |
find . ! -newer 2010010413010910.jpg -exec ls -l {} \; -rwxr-xr-x 1 mthoge cst 83794 Oct 1 2009 ./756dd0cfc10d94e5d8af57b6f240ce5b.jpg -rwxr-xr-x 1 mthoge cst 83794 Oct 1 2009 ./a0c7e33d200441888ee1912a7bb491f2.jpg -rwxr-xr-x 1 mthoge cst 20516 Oct 22 2009 ./1decdba76b4b134e4121dc70ab444b5d.jpg -rwxr-xr-x 1 mthoge cst 20516 Oct 22 2009 ./2bf27f1e9b61a18859bc31c916a62b24.jpg -rwxr-xr-x 1 mthoge cst 129012 Oct 22 2009 ./6fbb82aa701e7efdd17a351f23871d6a.jpg -rwxr-xr-x 1 mthoge cst 129012 Oct 22 2009 ./5bb1296814b8dcabc13c4a75d879960a.jpg -rwxr-xr-x 1 mthoge cst 20516 Oct 22 2009 ./b8372f70b61d8b8748b22b003c80f4e8.jpg -rwxr-xr-x 1 mthoge cst 20516 Oct 22 2009 ./86df56633c53472ba40cc9b1b98541e5.jpg -rwxr-xr-x 1 mthoge cst 20516 Oct 23 2009 ./20091023103121.jpg 以下略 |
2つのファイルを使い、期間で指定したい場合
findで期間指定
ファイル2つを使い、「期間」を条件としたい場合は以下のようにします。
文法
1 |
find . ! -newer [ファイルA] -and -newer [ファイルB] |
実例
【条件】
「2010年最後(ファイルA)より古い」 かつ 「2010年最初(ファイルB)より新しいもの」
1 |
find . ! -newer 20101229160631129.jpg -and -newer 2010010413010910.jpg |
前半を否定形、後半を肯定形とし「-and」で条件を繋げる形で記述できます。
検索されたファイルをまとめてコピーする
まとめてコピー
先ほどの条件で [bk_2010]ディレクトリ以下にファイルをコピー(cp)したい場合は以下のようにすれば可能です。
1 |
find . ! -newer 20101229160631129.jpg -and -newer 2010010413010910.jpg -exec cp -p {} bk_2010/{} \; |
-exec で、実行したいコマンド(cp)をつなげます。
cpの -p は、タイムスタンプなどの属性をそのままにコピーするオプションです。
まとめて移動
同様に[bk_2010]ディレクトリへ移動(mv)させたい場合は以下のようにします。
1 |
find . ! -newer 20101229160631129.jpg -and -newer 2010010413010910.jpg -exec mv {} bk_2010/{} \; |
まとめて削除
削除(rm)の場合は以下のように。
-f は同名ファイルを警告せずに削除するオプションです。
1 |
find . ! -newer 20101229160631129.jpg -and -newer 2010010413010910.jpg -exec rm -f {} \; |
findはなかなか使い勝手のあるコマンドですね。