用下划线替换空格只是一个简单的编程。我发现了一个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;
}
答案 0 :(得分:0)
正如手册页所示,在* fts_read *:
上访问目录(可读且不引起周期) 至少两次,一次是预购,一次是后序。
所以一种方法是测试这是否是一个目录,并在你第一次遇到它时跳过它。
另一种方法在手册页中描述,在* fts_set *上,带有选项FTS_AGAIN:
正常使用是针对后期目录访问,它会导致 要重新访问的目录(在预订和后序中) 就像它的所有后代一样。
顺便说一句,如果性能是您的问题,您可以使用* fts_children *, FTS_NAMEONLY 选项