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

jSORoROWy 2019-08-31 05:26:33
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;
}
}


...全文
516 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
jSORoROWy 2019-08-31
  • 打赏
  • 举报
回复
我对这个理解不够透彻,表述可能不太清楚 我以为只要系统调用读取文件信息的函数(getattr,readdir,opendir)时候,我告诉它这个文件是存在的,并且给他这个文件让他读就好了,可是实际上我即使告诉系统这个文件存在,并且已经是改名后的文件夹下的文件了,系统好像还是认为这个文件是关联在原来文件夹下的,于是在改名后的文件夹里就看不到它

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧