(5 réponses)
Fermé il y a 6 ans.
Lorsque xargs redirige la sortie de la première commande vers l'argument de la deuxième commande et qu'il n'y a pas de choix sur quel argument pour quel élément de la sortie, alors il n'y a qu'une seule façon, par exemple :
ls | xargs file # there are as many arguments as files in the listing,
# but the user does not have too choose himself
maintenant s'il y a besoin de choix :
ls | xargs file | grep image | xargs mv..... # here the user has to
# deal with two arguments of mv, first for source second for destination, suppose your destination argument is set already by yourself and you have to put the output into the source argument.
Comment dites-vous à xargs de rediriger la sortie standard de la première commande vers l'argument de votre choix de la seconde commande ?
Réponse acceptée :
Vous pouvez utiliser -I
pour définir un espace réservé qui sera remplacé par chaque valeur des arguments fournis à xargs
. Par exemple,
ls -1 | xargs -I '{}' echo '{}'
appellera echo
une fois par ligne à partir de ls
la sortie. Vous verrez souvent '{}'
utilisé, probablement parce que c'est la même chose que find
espace réservé.
Dans votre cas, vous devez également pré-traiter le file
's output pour extraire les noms de fichiers correspondants ; puisqu'il y a un grep
là-dedans, nous pouvons simplement utiliser awk
faire les deux, et simplifier le file
invocation également :
file * | awk -F: '/image/ { print $1 }' | xargs -I '{}' mv '{}' destination
Si vous avez GNU mv
vous pouvez simplement utiliser -t
pour passer plusieurs fichiers sources :
file * | awk -F: '/image/ { print $1 }' | xargs mv -t destination