gpt4 book ai didi

linux - 使用 fts(3) 函数重命名文件和目录。仅第一级发生变化

转载 作者:行者123 更新时间:2023-11-30 17:36:19 25 4
gpt4 key购买 nike

这只是一个用下划线替换空格的简单程序。我找到了一个 bash 脚本可以做到这一点,但速度很慢。据我了解,我想要一个深度优先搜索,并且我希望在后序目录上调用我的remove_space函数(在备份的过程中)。我对术语的理解正确吗?现在情况如何,我必须多次调用该程序才能更改所有名称。我认为因为它在返回输入目录时按预序更改了目录名称,所以它找不到它,因为它正在寻找旧名称。你知道我如何在 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;
}

最佳答案

正如手册页所述,在 *fts_read* 上:

Directories (that are readable and do not cause cycles) are visited at least twice, once in preorder and once in postorder.

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

手册页中的 *fts_set* 中描述了另一种方法,其中包含选项 FTS_AGAIN:

Normal use is for postorder directory visits, where it causes the directory to be revisited (in both preorder and postorder) as well as all of its descendants.

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

关于linux - 使用 fts(3) 函数重命名文件和目录。仅第一级发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22728099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com