如何在不使用system()的情况下使用C ++删除最后10个文件

时间:2019-02-18 15:21:34

标签: c++ linux

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

1 个答案:

答案 0 :(得分:1)

这里有些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;
}