如何在一行中为 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() 压缩没有父文件和根文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有警告的情况下使用 execv()?

execl vs execv,参数大小未知

如何在 Scala/Spark 中为数据框中的每一行编写一个 Json 文件并重命名文件

FileNotFoundError: [Errno 2] 没有这样的文件或目录 + os.execv

如何将字符串向量传递给execv

如何在安全管理器策略文件中为可变父目录授予文件读/写权限