如何递归执行chmod?

How to perform chmod recursively?

如何在运行时将文件夹及其所有子文件夹的权限递归更改为 0777?

代码为 c++,mac。我包括了 ,它有 chmod,但是没有关于如何递归执行它的文档。

最简单和最便携的方法是使用在 C++17 中添加的 std::filesystem 库。在那里,你会发现 recursive_directory_iterator 和许多其他方便的 类 和用于处理文件系统特定事物的函数。

示例:

#include <iostream>

#include <filesystem>            // see notes about these two lines at the bottom
namespace fs = std::filesystem;  // -"-

void chmodr(const fs::path& path, fs::perms perm) {
    fs::permissions(path, perm);      // set permissions on the top directory
    for(auto& de : fs::recursive_directory_iterator(path)) {
        fs::permissions(de, perm);    // set permissions
        std::cout << de << '\n';      // debug print
    }
}

int main() {
    chmodr("your_top_directory", fs::perms::all); // perms::all = 0777
}

但是,recursive_directory_iterator 在涉及的目录过多时会出现问题。它可能 运行 超出文件描述符,因为它需要保持许多目录打开。出于这个原因,我更喜欢使用 directory_iterator 来代替 - 并收集子目录以备后用。

示例:

#include <iostream>
#include <stack>
#include <utility>

#include <filesystem>            // see notes about these two lines at the bottom
namespace fs = std::filesystem;  // -"-

void chmodr(const fs::path& path, fs::perms perm) {
    std::stack<fs::path> dirs;
    dirs.push(path);

    fs::permissions(path, perm);

    do {
        auto pa = std::move(dirs.top()); // extract the top dir from the stack
        dirs.pop();                      // and remove it

        for(auto& de : fs::directory_iterator(pa)) {
            // save subdirectories for later:
            if(fs::is_directory(de)) dirs.push(de);
            else fs::permissions(de, perm);
        }
    } while(!dirs.empty());              // loop until there are no dirs left
}

int main() {
    chmodr("your_top_directory", fs::perms::all);
}

您可以阅读我在顶部。

在某些实现中,只有部分 C++17 支持,您可能会在 experimental/filesystem 中找到 filesystem。如果是这样的话,你可以替换上面的

#include <filesystem>
namespace fs = std::filesystem;

使用我在 中提供的 #ifdef 丛林。