- ベストアンサー
No.1067の『ファイルの削除について』の続き
あるディレクトリ内のファイル(ファイル名はマシン日付.csvとなっています。例:20040906.csv)を検索し、 今日より90日前の日付を取得し、それ以前のファイルをディレクトリから削除するという操作をしたいと思います。 ただし、ファイル名の20040906の前後に文字がある場合には削除できないようにしたいのです。 -------------------------------------- 以下、EtherskyのNo.1067に対する回答より抜粋 $day = 90; #90日前 $dir = './hoge'; #hogeディレクトリとする ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time-(60*60*24*$day)); #$day日前の日付を求める $del_target = sprintf("%04d%02d%02d",$year+1900,$mon+1,$mday); #yyyymmddの形にする($del_target前を削除対象にする) opendir(DIR,$dir); #ディレクトリを開く @list = grep {/\.csv$/i && -f "$dir/$_"} readdir(DIR); #ディレクトリから拡張子csvでファイルだけを吸い出してリストにする closedir(DIR); #ディレクトリを閉じる foreach (@list){ #リストから一つずつ調べる if(/(\d+)\.csv$/i){ #頭が数字のファイルだったら if($1 lt $del_target){ #$del_targetと比較して該当するなら unlink("$dir/$_"); #削除 } } } -------------------------------------- 上記の場合で試したところ、20040906の前にabcとつけると 削除されてしまいます。 後ろにabcがついている場合には削除されません。 どのようにすれば削除されないようになるでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> if(/(\d+)\.csv$/i){ #頭が数字のファイルだったら のところを if (/^(\d+)\.csv$/i) { とすればよいでしょう。 どうせなら、数字8桁の日付以外のファイルは全て除外するように、 if (/^(\d{8})\.csv$/i) { とした方が確実です。
その他の回答 (1)
- tatsu99
- ベストアンサー率52% (391/751)
if(/(\d+)\.csv$/i){ #頭が数字のファイルだったら を以下のように変えて下さい if(/^(\d+)\.csv$/i){ /のあとにハット(^)を入れて下さい。 確認してないので、自信なしです。
お礼
ご回答ありがとうございました。 参考にさせていただきます。
お礼
回答、ありがとうございました。 確かに数字8桁の日付以外のファイルはすべて除外する方が 安全ですね。