Linux的rename和mv命令是如何“递归”改名的
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 开头)
这个是我用于改名的函数
我现在在用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;
}
}
...全文
相关推荐
linux shell命令
linux shell命令
linux修改文件名的三种方法
linux修改文件名:文档中的命令经过本人的测试,并以图文并茂的方式详细描述了linux操作系统修改文件名的三种方式,每个命令都讲解了对应的语法、参数和示例。包含mv命令修改文件名、cp命令修改文件名、rename命令修改文件名。
详解Linux批量更改文件后缀名
本篇文章主要介绍了详解Linux批量更改文件后缀名,主要是使用了rename,有需要的朋友可以了解一下。
Linux运维常用命令.doc
Linux运维常用命令.doc
Linux基础——Linux 基本指令 touch, cp 和 mv
文章目录1.前言2.touch 新建3.cp 复制1. file1 复制成 file1copy2.-i (interactive)3.复制去文件夹4.-R (recursive)5.*复制多个文件4.mv 剪切1.移动去另一个文件夹2.重命名文件 1.前言 这次, 我们想要了解的是在 linux 中, 怎么样创建新文件, 复制, 粘贴, 剪切. 2.touch 新建 touch 的使用很简单, 我们先去往 Documents 的文件夹, 里面已经有了 folder1 和 file1, 如果我们想新建一个 file2 使用下面的语句就好. 一个空文件就建立好了. $ touch file2 如


