如何在一行中为 execv() 压缩没有父文件和根文件
Posted
技术标签:
【中文标题】如何在一行中为 execv() 压缩没有父文件和根文件【英文标题】:How do I tar compress without parent and root files in one line for execv() 【发布时间】:2020-10-16 03:02:36 【问题描述】:这个问题已经在这个网站上被问了一百万次了,有各种不同的解决方案,但似乎没有一个适合我的情况。
到目前为止,最有希望的是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)
返回/usr/bin/tar: *: Cannot stat: No such file or directory
我厌倦的另一行是将*
替换为.
但最终会包括根目录
【问题讨论】:
【参考方案1】: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()
通常是更简单的选择。
如果您想创建一个文件名列表以作为参数传递给命令行实用程序,请查看glob()
。
【讨论】:
我也想使用system()
,但为了这个项目,禁止使用system()
。我会看看glob()
,但我想确实没有简单的方法可以做到这一点。
@PapaSheng:glob 很容易使用,如果你被允许使用的话。它甚至可以让你在它返回的数组的开头保留一些空槽,然后你可以用 *
之前的 argv 条目来填充它们。
我明白了,我会调查一下,另一方面,char* args[] = "/bin/sh", "sh", "-c", "tar /usr/bin/tar -cvf testetest.tar -C dest *", NULL;
我怎么会execv()
这个?如果这可行,我想暂时修补它以进行临时修复。
@PapaSheng:我更明确地调用了 execv。我省略了使用snprintf
(或asprintf
,如果可用)将tar 文件名插入命令参数的部分。
这给了我一些关于如何解决这个问题的想法,谢谢以上是关于如何在一行中为 execv() 压缩没有父文件和根文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Scala/Spark 中为数据框中的每一行编写一个 Json 文件并重命名文件