指定日時以降に更新されたファイルを表示orコピー

更新ファイルの抽出

自分が週末に、どのファイルを触っていたかおぼえていなかったので、金曜日から更新のあったファイルを抽出することに。

※以下は、さくらのVPS標準のCentOS5.5での話。Mac OS Xに入っているcpは、--parentsとか-tオプション等が無かったりするようなので、GNU系の話ということで適当に。

指定した日時以降に更新されたファイルをリストアップ

% touch -t `date +201010010000.00` 20101004.start

% find . -type f -newer 20101001.start -print

touchで日付を指定したファイルを置いて、findを-newerオプションで実行。該当ファイルが出力される。-mtimeでも代用可能だと思うけど、x日前の指定というのが微妙にダルい。でも、この回りくどさは、もっとダルいような。さておき。

該当ファイルを更にコピーする

% mkdir updated_files

% find . -type f -newer 20101001.start -print0 | xargs -0 cp -t ./updated_files
cp: will not overwrite just-created `./updated_files/column.html' with `./themes/mono/include/column.html'

いまさらxargsの便利さを主張してみる を参考に、xargsを使ってみる。たしかにxargs便利だ。

このときは該当ファイルの中にcolumn.htmlが複数いたので、後発のcolumn.htmlが正しくコピーされない。作ったばっかりのcolumn.htmlを上書きしません、とのこと。

cp --parentsオプション

% find . -type f -newer 20101001.start -print0 | xargs -0 cp --parents -t ./updated_files

前項の問題に加え、そもそもディレクトリ構造も維持してコピーしたい。man cpに訊いてみたら、--parentsオプションがあったので指定し直して実行。バッチリ、ディレクトリ構造を維持したままコピーされた。

シェルスクリプトにしといた

#!/bin/bash

touch -t `date +$10000.00` $1.start

find . -type f -newer $1.start -print

if [ -n "$2" ]
then
    mkdir $2
    find . -type f -newer $1.start -print0 | xargs -0 cp --parents -t $2
    echo '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -'
    find $2 -type f
fi

rm $1.start

echo 'completed!'

使い方

2010年10月01日以降に更新されたファイルを表示
% updated 20101001

updated_filesにコピー
% updated 20101001 updated_files

手抜き仕様なので、カレントディレクトリ以下を対象に動作。