我一直在四处寻找并进行测试,我觉得没有解决办法,但我想在放弃之前提出问题。
我通过C创建tar文件,这会在某些时候产生这条指令:
execlp("tar", "tar", "czf", file_folder_out, "-C", file_folder_in, "./*", NULL);
在终端
中等效tar -czf /home/Skywalker/.tmp/test.tar.gz -C /home/Skywalker/.tmp/pack ./*
有没有办法从-C-C文件夹中获取所有文件而不手动指定它们(用readdir读取它们),并以root身份使用它们(不添加pack文件夹或。文件夹作为根文件夹)?我尝试了很多组合,但没有工作。
答案 0 :(得分:3)
您的意图是./*
是一个glob模式,指定当前目录中的所有文件(不以.
开头)。没有shell时它不起作用,因为它被shell扩展为当前目录中所有文件的列表。
我希望您意识到该命令不会归档所有 file_folder_in
指定的目录中的文件,因为./*
扩展到文件列表在当前目录中。它尝试归档file_folder_in
中与当前目录中的文件或目录名匹配的文件和子目录(不以.
开头)。
(按照惯例,*
(和等效的./*
)与以点开头的文件不匹配。)
我非常怀疑你打算执行
execlp("tar", "tar", "czf", file_folder_out, "-C", file_folder_in, ".", NULL);
代替,它告诉tar
归档file_folder_in
目录中的所有文件和子目录。
以上 包含以.
开头的文件。如果你想避免使用
execlp("tar", "tar", "czf", file_folder_out, "-C", file_folder_in, "--exclude", ".[^/]*", ".", NULL);
告诉tar
排除以.
开头的文件和目录(但不仅仅是./
,它指定当前目录)。我相信排除支持对于所有tar
变体都是通用的(我知道它应该适用于GNU tar和FreeBSD tar,但我不确定其他任何变量),所以它 应该工作tar变种 - 但出于完整性和可移植性的原因,我个人不会排除点文件。
有问题吗?