Linux的rename和mv命令是如何“递归”改名的

jSORoROWy jSORoROWy 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
rename和mv命令都没有递归的选项,那么它是如何实现对文件夹进行改名的呢?(或者说,linux是如何管理目录的呢?)


我现在在用fuse做一个文件系统,用一层的目录假装是多层,并使用map管理(如在dir1下新建一个dir11,其实是新建了一个key为/dir1/dir11的map),(我大概知道linux文件改名应该是不需要递归的,但是我mkdir的时候它给我传入的就是绝对路径,我直接拿绝对路径做的map)

但我使用mv,rename命令时,系统仅仅会调用一次rename函数,即使我在rename内部实现了所有key的改名,系统仍然不识别(仅认为改变了一个文件夹名)

rename: from[/dir1] to[/dir6] flags[0],这个是rename传入的参数,就是说系统仅仅调用了一次dir1到dir6的改名,而它之下的目录并没有改变(之下的目录还是以 dir1 开头)


这个是我用于改名的函数

bool rename(const std::string &from, const std::string &to) {
std::map<std::string, file_node>::iterator it = map_.find(from);
if(it == map_.end()) {
std::map<std::string, dir_node>::iterator dit = dir_map_.find(from);
if(dit == dir_map_.end()) {
return false;
}else {
std::map<std::string, dir_node>::iterator dit;
for(dit = dir_map_.begin(); dit != dir_map_.end(); dit++) {
std::string dtmp = dit->first;
if(!dtmp.find(from)) {/* find "path" at 0, means key is start with "path" */
dtmp.erase(0, from.length());
if(!dtmp.find("/") || dtmp.empty()) {
/* find "/" at 0, means not other dir that name start with "path" */
fprintf(stderr, "\e[1;31m\e[4m rename [%s] ", dit->first.c_str());
dtmp = to + dtmp;
fprintf(stderr, "to [%s]\e[m\n", dtmp.c_str());
dir_node dn(new dir_node_n(dtmp));
dir_map_.insert(std::make_pair(dtmp, dn));
dir_map_.erase(dit);
}
}
}
return true;
}
}else {
map_.insert(std::make_pair(to, it->second));
map_.erase(it);
return true;
}
}


...全文

相关推荐

评论 1
收藏 已收藏
分享
返回顶部
jSORoROWy
Linux_Kernel 4,469 成员 17,458 内容