获取tar的-C指定文件夹中的所有文件

获取tar的-C指定文件夹中的所有文件,c,tar,C,Tar,我一直在四处寻找和测试,我觉得没有解决办法,但我想在放弃之前问一下 我正在通过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创建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文件夹中获取所有文件,而无需手动指定它们(使用readdir读取它们),并将它们用作根目录(无需将pack文件夹或中的.folder添加为根文件夹)?我尝试了很多组合,但都没有成功。

您的意图是
/*
是一种全局模式,指定当前目录中的所有文件(不以
开头)。如果没有shell,它将无法工作,因为shell会将它扩展为当前目录中所有文件的列表

我希望您认识到,该命令不会将所有文件归档到中的
文件文件夹指定的目录中,因为
/*
会扩展到当前目录中的文件列表。它尝试将与当前目录中的文件名或目录名(不以
开头)匹配的
文件文件夹中的文件和子目录归档到

(按照惯例,
*
(以及等效的
/*
)与以点开头的文件不匹配。)

我高度怀疑你打算执行死刑

execlp("tar", "tar", "czf", file_folder_out, "-C", file_folder_in, ".", NULL);
相反,它告诉
tar
file\u文件夹中的所有文件和子目录归档到
目录中

上述文件也包括以
开头的文件。如果你想避免这种使用

execlp("tar", "tar", "czf", file_folder_out, "-C", file_folder_in, "--exclude", ".[^/]*", ".", NULL);
它告诉
tar
排除以
开头的文件和目录(但不仅仅是指定当前目录的
/
)。我相信exclude支持对于所有
tar
变体都是通用的(我知道它应该同时适用于GNU tar和FreeBSD tar,但我不确定是否适用于其他任何变体),所以不管tar变体如何,它都应该可以工作——但出于完整性和可移植性的原因,我个人不会排除dot文件


问题?

cd/home/Skywalker/.tmp/pack&&tar-czf/home….tar.gz。我说我是用C程序做的。我可以在shell中看到很多方法,但我只想执行tar,避免执行shell。哦,我没有看到任何关于需要避免shell的提及。我尝试与
*
组合,所以每次都失败了,谢谢你的回答。只是为了确保:两个指令给出相同的结果。对于这两种情况,我都得到了(用文件提取器打开)。/(文件夹在文件中)。似乎不应该是这样的。@markmb:如果在/.secret
中有子目录或文件
file\u文件夹,\u,第一个包含它,第二个不包含它。在这两种情况下,存储的路径都以
/
开头。如果
/
前缀困扰您,您需要使用
execlp(“tar”、“tar”、“czf”、file\u folder\u out、“-C”、file\u folder\u dir、file\u folder\u name、NULL)
execlp(“tar”、“tar”、“czf”、file\u folder\u out、“-C”、file\u folder\u dir、”、“*”、file\u folder\u name、NULL)
,其中
file\u folder\u dir
包含
file\u folder\u in
中的目录部分,即除最后一个组件外的所有组件,
file\u folder\u name
最后一个组件(
basename(file\u folder\u in)
)。