En effet, le matching sur l'* est fait par le shell, pas par xargs... et en pratique, il se passe ceci:
1) le shell analyse la ligne, et voie la commande suivante:
xargs -i -t mv [...]/backup_user_{}* /backup[...]
2) il cherche donc à évaluer, mais comme le [...]_user_{}* ne correspond à rien, il laisse tel quel (note: un tcsh aurait généré une erreur no match)
3) la commande xargs recoit donc le pattern avec l'*, comme tu t'y attend en fait;
4) xargs remplace le {}, car tu le lui as demandé...
5) et il lance lui-même la commande, donc l'* n'est pas évaluée par le/un shell...
...d'où problème.
Je te conseilles donc fortement la solution que te proposes fearan ci-dessus, car dans son cas le shell voie bien l'* après la substitution, puisqu'il la fait lui-même.
PS1: Perso, plutôt qu'un for, j'utilise un while qui est moins source de problèmes: cat user | while read name; do mv ...$name...; done
PS2: Penses à bien mettre des guillements (") autours des chemins si tu veux éviter les problèmes...
# ça ne peut pas marcher :(
Posté par Christophe --- . En réponse au message xargs et caractères spéciaux. Évalué à 1.
1) le shell analyse la ligne, et voie la commande suivante:
xargs -i -t mv [...]/backup_user_{}* /backup[...]
2) il cherche donc à évaluer, mais comme le [...]_user_{}* ne correspond à rien, il laisse tel quel (note: un tcsh aurait généré une erreur no match)
3) la commande xargs recoit donc le pattern avec l'*, comme tu t'y attend en fait;
4) xargs remplace le {}, car tu le lui as demandé...
5) et il lance lui-même la commande, donc l'* n'est pas évaluée par le/un shell...
...d'où problème.
Je te conseilles donc fortement la solution que te proposes fearan ci-dessus, car dans son cas le shell voie bien l'* après la substitution, puisqu'il la fait lui-même.
PS1: Perso, plutôt qu'un for, j'utilise un while qui est moins source de problèmes:
cat user | while read name; do mv ...$name...; done
PS2: Penses à bien mettre des guillements (") autours des chemins si tu veux éviter les problèmes...