• ベストアンサー

ファイル検索の条件について

Linux+C言語で開発しています。 あるディレクトリ内にファイル名が日付のファイル(YYYYMMDDhhmmss.jpg)があり、それをプログラム中から消去するプログラムを考えています。 消したいファイルは前日以前分全てです。 system()でlsなどを行って、ファイルリスト作成(1)後、rmコマンドで順次消去(2)することを考えたのですが、 (1)で行うファイルリストの作成条件が思いつきません。  例えば、ls 20051110*.jpgとして行うと、11月10日分は検索にヒットしますが、それ以前の古い分はヒットしないですよね。かといってls 200511*.jpgとしてしまうと今日(11日)の分もヒットしてしまうし。。。 どうすればいいでしょうか??

質問者が選んだベストアンサー

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.2

がると申します。 かなり汚いやり方にはなってしまうのですが。 もしlsコマンドを使うなら、-tオプションをつけると、時間軸降順(新しい順)にファイルが並びます。 後は先頭から判定をしていき「現在日付の前日の日付ファイルが出てきた」ら、それ以降の全てのファイル名を「削除対象」にしてしまえば取り合えず可能か、と。 ほかにもいくつか手段はありますが、取り合えず一例を。

その他の回答 (2)

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.3

#include <time.h> #include <errno.h> #include <string.h> #include <stdio.h> #include <stdlib.h> char *prog; void usage(void) { fprintf(stderr, "%s: remove files before yesterday\n", prog); exit(-1); } int main(int argc, char *argv[]) { char buf[BUFSIZ]; FILE *pls; struct tm tm_yesterday, tm_file; time_t t, yesterday, file; prog = argv[0]; if (argc != 1) { usage(); } t = time(NULL); gmtime_r(&t, &tm_yesterday); tm_yesterday.tm_sec = 0; tm_yesterday.tm_min = 0; tm_yesterday.tm_hour = 0; tm_file = tm_yesterday; yesterday = mktime(&tm_yesterday); if ((pls = popen("ls *.jpg", "r")) == NULL) { fprintf(stderr, "%s: Can't exec ls\n", prog); exit(errno); } while (fgets(buf, BUFSIZ, pls) != 0) { if (sscanf(buf, "%4d%2d%2d%*[^.].jpg\n", &tm_file.tm_year, &tm_file.tm_mon, &tm_file.tm_mday) == 3) { tm_file.tm_year -=1900; tm_file.tm_mon--; file = mktime(&tm_file); buf[strlen(buf)-1]=0; if (file < yesterday) { printf("rm %s\n", buf); unlink(buf); } } } return (0); }

回答No.1

「ls *jpg」の結果をファイルに出力して、そのファイルを1行ずつ読み込みながら、削除/保存の判断を行わせてはどうでしょうか?(lsには、ファイル名のみ出力するオプションがあったと思うのでそれを使うとシンプルにできるかと) すみません、これくらいしか案が浮かびません。。。

関連するQ&A