指定日時以降に更新されたファイルを表示orコピー
Posted: Updated:
更新ファイルの抽出
自分が週末に、どのファイルを触っていたかおぼえていなかったので、金曜日から更新のあったファイルを抽出することに。
※以下は、さくらの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
手抜き仕様なので、カレントディレクトリ以下を対象に動作。