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