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.