Unix – La commande Find avec tar et gz fonctionne bien depuis la ligne de commande mais ne fonctionne pas sur Script

Lorsque j’utilise cette commande sur la ligne de commande avec des valeurs codées en dur pour les parameters $ dir, $ year, $ month, cela fonctionne très bien et crée le fichier gzip. J’ai vérifié le contenu du fichier gz et je vois les résultats souhaités.

find $dir -name '*_$year-$month-*' -type f -print | \ xargs tar -zvcf $dir/log.$year-$month.tar.gz 

Mais lorsque je l’intègre dans un script shell et que je l’exécute, il ne fonctionnera pas et me donnera cette erreur.

tar: Cowardly refusing to create an empty archive

Tout d’abord, votre one-liner est plein de citations:

  • $dir se cassera si le nom du répertoire contient des espaces. Vous avez besoin de "$dir" place

  • Les guillemets simples empêchent l’expansion des variables – '*_$year-$month-*' devrait probablement être "*_$year-$month-*" .

    Dans votre code de script shell, find ne correspondra à aucun fichier (vous n’avez pas de nom de fichier avec la chaîne _$year-$month- , _$year-$month- -ce pas?) Et donc tar ne sera pas fourni avec les fichiers à inclure dans l’archive .

En revanche, l’utilisation de xargs dans ce cas particulier est dangereuse – si vous avez trop de fichiers, xargs appellera plusieurs fois tar et tous les fichiers archivés à l’exception de la dernière exécution sera effacée de l’archive.

De plus, cette commande va également casser des chemins de fichiers avec des espaces – par défaut, xargs utilise des espaces comme séparateur d’arguments. Selon la version des fichiers binarys xargs et xargs que vous utilisez, il peut y avoir une option -print0 pour find et une option -0 correspondante pour que xargs traite ce problème:

 find ... -print0 | xargs -0 ... 

Enfin, certaines versions de xargs ont la possibilité d’éviter d’appeler la commande spécifiée si aucun argument n’a été fourni – pour GNU xargs qui est l’option -r :

 find ... -print0 | xargs -0 -r ... 

La substitution de variables ne se produit pas entre guillemets simples.

Utilisez des guillemets doubles: find "$dir" -name "*_$year-$month-*" ...

(Vous pouvez utiliser différents types de guillemets dans le même argument s’il est nécessaire (pas ici): '*_'"$year" )

Si vous le pouvez, essayez de faire echo aux valeurs de $dir , $year , $month depuis le script shells sur la console. Il est possible que ces valeurs soient différentes dans le shellscript.

Sûrement, quelle find et quel tar utilise le script shell? Essayez d’utiliser les chemins d’access complets pour les diagnostics ou modifiez la valeur de $PATH pour qu’elle corresponde à ce que vous obtenez lorsque vous exécutez la commande à partir de la ligne de commande.