首页 > 解决方案 > 如何在不使用 system() 的情况下使用 c++ 删除除最后 10 个文件之外的所有文件

问题描述

如何在不使用 system() 的情况下实现 system("ls -t1 . | tail -n +11 | xargs rm -rf")。我只想在我的 linux 文件夹中保留最新的 10 个文件,当我调用 c++ 函数时,其余的应该被删除。

标签: c++linux

解决方案


这是一些不需要存储所有条目的 C++ 代码,但只记住最旧的 10 个并删除任何较新的条目。

与删除文件的代码一样,如果您运行以下代码,请注意以下代码将删除文件

#include <filesystem>
#include <vector>
#include <queue>
#include <iostream>

namespace fs = std::filesystem;
using pathvec = std::vector<fs::directory_entry>;

struct newer_file {
    bool operator()(const fs::directory_entry& p, const fs::directory_entry& p2)
    {
        return p.last_write_time() < p2.last_write_time();
    }
};

void delete_newest(fs::path directory, int keep_n = 10)
{
    //store N oldest entries, delete any that are newer
    std::priority_queue<fs::directory_entry, pathvec, newer_file> oldestN;
    for (auto entry : fs::directory_iterator(directory))
    {
        oldestN.push(entry);
        if (oldestN.size() > keep_n)
        {
            //careful, recursive delete
            fs::remove_all(oldestN.top());
            oldestN.pop();
        }
    }
}

int main(int argc, const char** argv)
{
    if (argc < 2)
    {
        std::cout << "argument needed" << std::endl;
        return -1;
    }
    delete_newest(fs::path(argv[1]));
    return 0;
}

推荐阅读