C — Linux — удаление файлов в указанном каталоге, которым не менее 5 дней

#c #linux

#c #linux

Вопрос:

Как мне изменить этот код, чтобы удалить все файлы в указанном каталоге, которым не менее 7 дней. Вот следующий исходный код, который у меня есть:

 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <direct.h>
#include <cstring>

int main(int argc, char* argv[1]) { 
 if (argc < 2) { 
      std:cerr<<"Usage: " << argv[0] << " <filename>" << std::endl;
      return 1;
 }

 struct stat buffer;

 for (int i; i < argc;   i) { 
      int result = stat(argc[i], amp;buffer);

      if (result != 0) { 
           std::cerr << argv[i] << ": "<<stderror(errno) << std::endl;
           continue;
      }

      char datetime[100] = [0];
      const struct tm* time = localtime(sbuffer.st_mtime);
      result = strftime(datetime, 100, "%c", time);

      std::cout << argv[i] << ": " << datetime << std::endl;
 }

 return 0;
}
  

Как мне получить это, чтобы получить возраст файла и удалить файлы старше 7 дней? Любые предложения будут оценены!

Ответ №1:

Внимательно прочитайте справочные страницы stat(2) и time(7). Ваш sbuffer содержит st_mtime поле. Сравните его с текущим временем, полученным, например, с помощью time(2)

Обратите внимание, что день обычно составляет 86400 секунд, поэтому 7 дней — это 7 * 86400, то есть 604800 секунд.

Чтобы удалить файл, используйте unlink(2). Я бы рекомендовал использовать readdir(3) с opendir(3) для чтения каталога. (Но игнорируйте записи .. и . ).

Я бы также рекомендовал собрать список имен файлов, подлежащих удалению, например, в std::vector<std::string>

Если вы хотите рекурсивно сканировать каталоги (и их подкаталоги и т. Д.), Рассмотрите nftw(3)

(Вы, вероятно, не хотите использовать system в своей домашней работе)

Ответ №2:

Это может быть так просто, как:

 system( "find <dir> -maxdepth 1 -mtime 5 -exec rm -f {} ;" );
  

Но если у вас есть особые требования, вам нужно их опубликовать.

Комментарии:

1. Я не уверен, что это правильный ответ для такой домашней работы.

2. @BasileStarynkevitch Почему я поставил отказ от ответственности за требования?

3. Вопрос @asveikau OP — C в Linux.

4. @Slava — Тот факт, что они находятся на C в Linux, не делает system() менее плохой идеей.