Macで特定日時以降に編集したファイルを抽出してみた

「数あるファイルの中から触ったファイルだけを抽出してコピーする」という事をWindowsではFire File Copyを使って実現していたのですが、Macに移ってから出来なくなっていました。

ファイルの更新日時からフィルタリングが出来れば良いので、そういったことが出来そうなアプリを探してみたのですがイマイチピンと来るものもなく、どうしようかと悩んでいる時にこの記事を見て、Mac用に変換して使えるのではないかと思ったので試行錯誤してみました。

とりあえずコピペ

まずそのまま使えるとベターなのでコピペしてみたのですが、「Mac OS Xに入っているcpは、-parentsとか-tオプション等が無かったりするようなので、GNU系の話ということで適当に」と書いてある通り動きませんでした。

結構重要な-parentsが動作しないままでは難しそうなのでちょっと工夫してみます。

「古い」データを削除してみる

ということで、「一旦全てコピー」→「指定日時より古いファイルを削除」という流れに変えてみました。

#!/bin/bash

if [ -n "$3" ]  
then  
    cp -r -p $1 $3

    cd $3
    touch -t `date +$2.00` $2.start

    find . -type f -not -newer $2.start -print

    find . -type f -not -newer $2.start -print0 | xargs -0 rm -fr
    echo '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -'
    find . -type f
fi

cd ../  
find $3 -type d -empty -delete

echo 'completed!'  

最初にcp -r -pで全てコピーをし、findの条件式の所を反対にして、xargscprmにした感じです。 後は空っぽのフォルダが出てきてしまうので、find -type d -empty -deleteで削除しています。

正直な所、無駄なコマンドがあるんじゃないかと思うのですが、動いているので触っていません…。

使い方

こんな感じです。

. path/to/updated.sh from YYYYMMDDHHII to

例えば、コピー元「hoge」ディレクトリを「fuga」ディレクトリに2013年1月1日9時15分以降のファイルをコピーしようとすると、

. path/to/updated.sh hoge 201301010915 fuga

という感じになります。

その他

最初に全てコピーしているので、大量のファイルとかには向かないのでは無いかと思うのですが、今のところ500〜600ファイルの場合は気にならないレベルだと感じています。

個人的にはコマンドラインにあんまり慣れていない(一度日時設定間違ってがっつり消してしまったりした)ので、GUIのアプリとか見つかるといいのですが…。

念のため、探している間に見つけた他の方法も参考サイトに挙げておきますが、もし良さげなモノが見つかればまた紹介するようにします。

参考サイト

追記 13/05/14

MacでもGUIのアプリが見つかりましたので、紹介記事を書きました。
こちらもご確認下さい。

Win/Mac両対応の更新ファイルを抽出して書き出すAIRアプリ「Cowsee」が便利