Maison >développement back-end >Golang >Pourquoi mon Go `exec.Command` échoue-t-il avec des caractères génériques alors que le terminal réussit ?

Pourquoi mon Go `exec.Command` échoue-t-il avec des caractères génériques alors que le terminal réussit ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-08 09:27:12363parcourir

Why Does My Go `exec.Command` Fail with Wildcards While the Terminal Succeeds?

Échec de la commande Golang Exec avec des caractères génériques malgré le succès du terminal

Dans Go, le package exec est utilisé pour exécuter des commandes externes. Lorsque vous tentez d'exécuter une commande 'mv' à l'aide de caractères génériques ('./source-dir/*'), une erreur de « état de sortie 1 » se produit avec la sortie indiquant « Aucun fichier ou répertoire de ce type ». Cependant, l'exécution de la même commande dans le terminal avec le caractère générique réussit.

Pourquoi les caractères génériques échouent dans Go

Contrairement au shell, où le shell interprète le caractère générique et le développe en une liste de correspondances fichiers, le package exec traite le caractère générique littéralement comme un seul argument. Cela signifie que la commande 'mv' voit un caractère générique ('*') au lieu d'une liste de noms de fichiers.

Solutions

Pour utiliser des caractères génériques dans Go, il existe deux approches :

  1. Utiliser filepath.Glob() : Cette fonction renvoie une tranche de chaînes contenant la liste des correspondances noms de fichiers pour un modèle donné. Vous pouvez ensuite utiliser cette liste comme arguments de la commande 'mv'.
import "path/filepath"

files, err := filepath.Glob("./source-dir/*")
if err != nil {
    // Handle error
}

cmd := exec.Command("mv", files...)
  1. Invoquer le Shell : Vous pouvez appeler le shell et transmettre la commande comme un argument, permettant au shell d'interpréter le caractère générique et de le développer dans la liste d'arguments appropriée.
cmd := exec.Command("/bin/sh", "-c", "mv ./source-dir/* ./dest-dir")

Fichier récursif Mouvement

Pour déplacer de manière récursive tous les fichiers d'un répertoire source vers un répertoire de destination, vous devez parcourir de manière récursive le répertoire source et déplacer chaque fichier ou répertoire trouvé. Si la source contient des sous-répertoires, vous pouvez soit déplacer chaque sous-répertoire de manière récursive, soit utiliser un package comme os qui fournit des fonctions pour déplacer les arbres.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn