Le shell tente d'élargir le motif glob avant de passer le résultat élargi à cp
(en fait, il passe le résultat à sudo
qui le transmet ensuite inchangé à cp
). Puisque le shell (il s'exécute en tant que vous, pas en tant que root) n'est pas capable de parcourir le répertoire, cp
finit par recevoir le motif non élargi dans sa liste d'arguments.
cp
ne réalise aucune expansion de glob par lui-même. Il attend une liste de noms de fichiers. La chaîne avec le motif ne nomme pas un fichier.
Peut-être la manière la plus directe de réaliser la tâche est d'invoquer votre commande dans un sous-shell. Citez la commande avec soit des guillemets doubles ("
) ou simples ('
).
sudo sh -c "cp /data/*20150522* /backup/"
sudo sh -c 'cp /data/*20150522* /backup/'
Cela fonctionne car le sous-shell élargit le motif glob dans la chaîne de commande avant d'invoquer la commande. Puisque le sous-shell s'exécute en tant que root sous sudo
, l'expansion réussit.
Utiliser des guillemets doubles pour citer la commande au sous-shell permet au shell parent d'élargir les variables du shell avant d'invoquer la commande sudo
. Si vous souhaitez que les variables soient élargies par le sous-shell, les guillemets simples doivent être utilisés à la place. Dans ce cas, c'est équivalent, car vous n'avez pas de variables. Mais, vous pourriez en ajouter une pour voir la différence de comportement.
sudo sh -c "echo $USER; cp /data/*20150522* /backup/"
sudo sh -c 'echo $USER; cp /data/*20150522* /backup/'
La première commande affichera votre nom d'utilisateur, tandis que la deuxième commande affichera le nom de l'utilisateur root.