我如何 tar 在一行中压缩没有父文件和根文件的 execv()
How do I tar compress without parent and root files in one line for execv()
这个问题在这个网站上被问过一百万次,有各种不同的解决方案,但似乎没有一个适合我的情况。
到目前为止,最有希望的是 tar -cvf testetest.tar -C folder1 *
,其中 folder1 包括:
Folder1
>txt1.txt
>folder2
>txt2.txt
运行 上面的代码在终端中创建 testtest.tar
其中包括一堆错误消息:
txt1.txt
folder2
>txt2.txt
然而,当 运行 在函数中通过 execv 像这样时:
pid_t archive = fork();
switch(archive)
{
case -1 :
{
printf("fork() failed\n");
break;
}
case 0 :
{
if( strcmp(getFileExtension(finalArchiveName), "tar") == 0)
{
char* args[] = {"/usr/bin/tar","-cvf", finalArchiveName, "-C", "dest", "*", NULL};
int error = execv("/usr/bin/tar", args);
if(error == -1){
perror("Error when archiving");
exit(EXIT_FAILURE);
}
else{
exit(EXIT_SUCCESS);
}
break;
}
//... (not including the whole function, only the part i feel is relevant to the question)
它 returns 和 /usr/bin/tar: *: Cannot stat: No such file or directory
我厌倦的另一行是用 .
替换 *
但是最终包括根目录
shell 将 *
替换为文件名列表,如您在 shell 中键入 echo *
所见。但是在对 execv
的调用中没有 shell,除非你专门执行一个 shell:
char* args[] = {"sh", "-c", "tar /usr/bin/tar -cvf testetest.tar -C dest *", NULL};
int error = execv("/bin/sh", args);
在这种情况下,system()
通常是更简单的选择。
如果您想创建一个文件名列表作为参数传递给 command-line 实用程序,请查看 glob()
.
这个问题在这个网站上被问过一百万次,有各种不同的解决方案,但似乎没有一个适合我的情况。
到目前为止,最有希望的是 tar -cvf testetest.tar -C folder1 *
,其中 folder1 包括:
Folder1
>txt1.txt
>folder2
>txt2.txt
运行 上面的代码在终端中创建 testtest.tar
其中包括一堆错误消息:
txt1.txt
folder2
>txt2.txt
然而,当 运行 在函数中通过 execv 像这样时:
pid_t archive = fork();
switch(archive)
{
case -1 :
{
printf("fork() failed\n");
break;
}
case 0 :
{
if( strcmp(getFileExtension(finalArchiveName), "tar") == 0)
{
char* args[] = {"/usr/bin/tar","-cvf", finalArchiveName, "-C", "dest", "*", NULL};
int error = execv("/usr/bin/tar", args);
if(error == -1){
perror("Error when archiving");
exit(EXIT_FAILURE);
}
else{
exit(EXIT_SUCCESS);
}
break;
}
//... (not including the whole function, only the part i feel is relevant to the question)
它 returns 和 /usr/bin/tar: *: Cannot stat: No such file or directory
我厌倦的另一行是用 .
替换 *
但是最终包括根目录
shell 将 *
替换为文件名列表,如您在 shell 中键入 echo *
所见。但是在对 execv
的调用中没有 shell,除非你专门执行一个 shell:
char* args[] = {"sh", "-c", "tar /usr/bin/tar -cvf testetest.tar -C dest *", NULL};
int error = execv("/bin/sh", args);
在这种情况下,system()
通常是更简单的选择。
如果您想创建一个文件名列表作为参数传递给 command-line 实用程序,请查看 glob()
.