使用fts(3)函数重命名文件和目录。只有第一级才会改变

时间:2014-03-28 16:37:51

标签: linux c

用下划线替换空格只是一个简单的编程。我发现了一个bash脚本可以做到但它很慢。从我的理解,我想要深度优先搜索,我希望我的remove_space函数在后序(在备份的路上)上的目录上调用。我能正确理解术语吗?它是如何现在我必须多次调用该程序,因为它有dir级别来更改所有名称。我认为因为当它返回进入dir时它会预先改变dir名称它找不到它,因为它正在寻找旧名称。你知道我如何在postoder中的目录上调用我的函数吗?

提前感谢!

int main(int argc, char *argv[]) {
char * const *old_name = (argv + 1);
int opts = 0;
FTS *ftsp;
FTSENT *scan;

if (argc < 2) {
    fprintf(stderr, "usage: %s <dir path>\n", *argv);
    exit(1);
}

opts |= (FTS_PHYSICAL | FTS_SEEDOT | FTS_XDEV);

ftsp = fts_open(old_name, opts, NULL);

while ((scan = fts_read(ftsp)) != NULL) {
    if (scan->fts_info == FTS_DOT)
        continue;
    remove_space(scan->fts_name);
    printf("%s\n", scan->fts_name);
}

fts_close(ftsp);
return 0;
}

int remove_space(const char *old_str) {
char new_str[strlen(old_str)];
int i = 0;
int j = 0;

while (*(old_str + i)) {
    if (isalnum(*(old_str + i))) {
        while (*(old_str + i)) {

            if (*(old_str + i) == SPACE)
                *(new_str + j) = UNDER_SCORE;
            else
                *(new_str + j) = *(old_str  + i);
            i++;
            j++;
        }
    } else {
        i++;
    }
}
*(new_str + j) = '\0';
rename(old_str, new_str);
return 0;
}

1 个答案:

答案 0 :(得分:0)

正如手册页所示,在* fts_read *:

  

访问目录(可读且不引起周期)   至少两次,一次是预购,一次是后序。

所以一种方法是测试这是否是一个目录,并在你第一次遇到它时跳过它。

另一种方法在手册页中描述,在* fts_set *上,带有选项FTS_AGAIN:

  

正常使用是针对后期目录访问,它会导致   要重新访问的目录(在预订和后序中)   就像它的所有后代一样。

顺便说一句,如果性能是您的问题,您可以使用* fts_children *, FTS_NAMEONLY 选项