Cette question a été posée un million de fois sur ce site avec diverses solutions différentes, mais aucune ne semble fonctionner pour mon cas.

Jusqu'à présent, le plus prometteur est tar -cvf testetest.tar -C folder1 * où folder1 comprend :

Folder1
    >txt1.txt
    >folder2
        >txt2.txt

L'exécution du code ci-dessus dans le terminal crée testtest.tar qui inclut un tas de messages d'erreur :

txt1.txt
folder2
    >txt2.txt

Cependant, lorsqu'il est exécuté dans une fonction via execv comme ceci :

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)

Il revient avec /usr/bin/tar: *: Cannot stat: No such file or directory

Une autre ligne que j'ai fatiguée est de remplacer le * par . mais cela finit par inclure le répertoire racine

1
PapaSheng 16 oct. 2020 à 06:02

1 réponse

Meilleure réponse

Le shell remplace le * par une liste de noms de fichiers, comme vous pouvez le voir en tapant echo * dans un shell. Mais il n'y a pas de shell dans un appel à execv, sauf si vous exécutez spécifiquement un shell :

char* args[] = {"sh", "-c", "tar /usr/bin/tar -cvf testetest.tar -C dest *", NULL};
int error = execv("/bin/sh", args);

Dans un tel cas, system() est souvent une alternative plus simple.

Si vous souhaitez créer une liste de noms de fichiers à transmettre en tant qu'arguments à un utilitaire de ligne de commande, consultez glob().

1
rici 16 oct. 2020 à 04:16